Laravel 5中SELECT REPLACE()函数无法使用的问题求助
解决Laravel中使用REPLACE()函数查询时的列不存在错误
这个问题我之前也碰到过,核心原因是Laravel查询构建器对select参数的处理逻辑和原生SQL不同:当你直接把'*, REPLACE(abstract, \'[[name]]\', name) AS abstract'作为单个字符串传给select()方法时,Laravel会把整个内容当成一个单独的字段名,自动给它加上反引号,最终生成的SQL就变成了:
select `*, REPLACE(abstract, '[[name]]', name)` as `abstract` from `products` limit 3 offset 0
数据库自然会认为这是一个不存在的列,从而抛出1054 Unknown column错误。而phpMyAdmin里能正常执行,是因为它直接运行原生SQL,不会做这种自动包裹处理。
下面给你两种可行的解决方案:
方案一:用DB::raw()包裹原生SQL部分
把*和REPLACE表达式分开作为select()的参数,其中REPLACE部分用DB::raw()来告诉Laravel这是原生SQL,不需要转义:
use Illuminate\Support\Facades\DB; $p = Products::select('*', DB::raw('REPLACE(abstract, "[[name]]", name) AS abstract'))->paginate(10);
方案二:直接使用selectRaw()方法
Laravel提供了selectRaw()方法,专门用来直接传入原生的SELECT字段列表,这样就不需要额外处理:
$p = Products::selectRaw('*, REPLACE(abstract, "[[name]]", name) AS abstract')->paginate(10);
这两种方法都能生成正确的原生SQL,解决你遇到的列不存在问题。
内容的提问来源于stack exchange,提问作者Dong3000
相关产品推荐
相关产品推荐

