Laravel中如何将原生SQL传入查询构造器获得可操作实例
Laravel 原生不支持直接传入完整的 SELECT SQL 语句来初始化查询构造器,也不能直接向已有构造器传入完整原生 SQL 后继续链式追加查询条件。原因是查询构造器需要拆分 SQL 的各个语法片段(查询字段、表来源、过滤条件、排序规则等)才能保证后续追加的语法合法,它没有内置解析完整原生 SQL 并拆分对应片段的能力。
你可以通过以下两种方案实现类似的使用需求:
方案1:将原生SQL作为子查询设置为表来源
如果你的原生 SQL 是基础查询内容,可以把它包装成子查询作为构造器的表来源,后续可以正常调用所有查询构造器方法:
// 原生SQL作为子查询,必须设置别名 $rawSQL = "(select * from table where 初始过滤条件...) as base_table"; $builder = DB::table(DB::raw($rawSQL)); // 后续可以正常链式调用所有构造器方法 $builder->where('column', '目标值')->orderBy('created_at', 'desc')->paginate(10);
方案2:局部插入原生片段到已有构造器
如果不需要完全替换整个基础查询,只是要在现有构造器基础上追加自定义原生语法,可以使用 Laravel 提供的各类 raw 方法:
- 追加自定义查询字段:
$builder->selectRaw('count(*) as user_count, year(created_at) as register_year') - 追加自定义过滤条件:
$builder->whereRaw('price > discount * 1.2 and stock > 0') - 追加自定义关联逻辑:
$builder->joinRaw('left join roles on users.role_id = roles.id and roles.status = 1')
你此前使用的 DB::select 属于直接执行 SQL 并返回结果数组的方法,自然不会返回可链式调用的查询构造器实例。
内容的提问来源于stack exchange,提问作者lightning_missile
相关产品推荐
相关产品推荐

