将原始 SQL 查询传递给 Laravel 上的查询构建器
Posted
技术标签:
【中文标题】将原始 SQL 查询传递给 Laravel 上的查询构建器【英文标题】:Passing a raw SQL query to query builder on Laravel 【发布时间】:2021-08-06 05:50:10 【问题描述】:有没有办法用原始查询初始化 laravel 的查询构建器?或者至少在现有实例中传递完整的原始 SQL 查询?像这样的:
$rawSQL = "select * from table ...";
$builder = DB::query($rawSQL); // returns a query builder instance
$builder->where(...); // like a normal ->where method in query builder
我尝试过 DB::select,但它返回一个数组,而不是一个可以被更多查询更新的查询生成器实例。
【问题讨论】:
是的,你可以:laravel.com/docs/8.x/queries#raw-expressions @Justinas 我会尝试,但它似乎只允许原始查询的片段,而不是整个查询。 【参考方案1】:你可以使用Builder::fromSub()
:
$rawSQL = "select * from table ...";
$builder = DB::query();
$builder->fromSub($rawSQL);
$builder->where(...); // like a normal ->where method in query builder
【讨论】:
使用您的示例:$builder-->toSql() 返回“select * from select * from table ...”。查询格式不正确。虽然你给了我一个想法。如果我可以将查询变成“select * from (select * from table) as t”,整个查询能有多慢? 我不认为,这会使查询明显变慢,但如果可以避免,那就更好了。 您可以通过$query->fromSub($rawSQL, 'sub')
实现您想要做的事情
不幸的是,Builder 似乎没有办法解析整个查询。以上是关于将原始 SQL 查询传递给 Laravel 上的查询构建器的主要内容,如果未能解决你的问题,请参考以下文章