将原始 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 上的查询构建器的主要内容,如果未能解决你的问题,请参考以下文章

将原始 SQL 转换为 Laravel 查询构建器

我如何将 SQL 原始查询重写为 Laravel 查询生成器

将原始 SQL 与 Doctrine 一起使用

获取 laravel 4 迁移执行的原始 SQL

在原始 sql 查询 Laravel 中插入变量

Laravel 5.2 将变量传递给查询生成器