Laravel Eloquent builder 查询日志

Posted

技术标签:

【中文标题】Laravel Eloquent builder 查询日志【英文标题】:Laravel Eloquent builder query log 【发布时间】:2020-10-30 21:32:58 【问题描述】:

我为我们的 API 创建了一个JSON search engine。

组装查询的逻辑如下;

Laravel 宏用于在 Eloquent 模型上启用搜索方法,该模型创建类的实例并运行搜索方法:

/**
 * @var $this Builder
 */
$searcher = new Searcher($this, $request);
$searcher->search();

为了保持分离,具有 URL 查询逻辑的请求参数类是动态实例化的,并且具有与依赖项相同的查询构建器。在 foreach 循环中执行以下操作:

new $parameter($this->request, $this->builder, $this->modelConfig);

为了查看实际搜索到的内容,我设置了日志以编写实际查询和绑定

Log::info('[Search] SQL: ' . $this->builder->toSql() . " Bindings: " . implode(', ', $this->builder->getBindings()));

现在我遇到的问题是,在加载相关模型时(在请求参数之一 (RelationsParameter) 中使用 ->with(),我确实得到了我所要求的,因此模型与传递给的关系一起加载但是,它永远不会反映在查询中。

我将始终以SELECT * FROM table WHERE something 结尾,而无需提及相关表。有没有办法获取底层查询?

【问题讨论】:

你试过这个***.com/questions/41140975/… 吗? 【参考方案1】:

您可以将代码包装在 Laravel 的查询记录器周围:

\DB::connection()->enableQueryLog();
// your code
\DB::connection()->disableQueryLog();

之后,您可能会收到带有\DB::getQueryLog() 的记录查询。

但是,如果您只是想在开发时登录,我会使用 barryvdh/laravel-debugbar 包。

【讨论】:

【参考方案2】:

我一直在深入挖掘 Laravel 本身,而对于为什么 toSql() 方法不转储关系 SQL 的问题的答案是因为它在 eagerLoadRelations 方法被触发之前被编译。

因此,目前不可能在使用查询构建器操作时转储整个 SQL。

halloei 的建议将转储所有执行的查询,但这对我没有帮助,因为它需要我在包外添加代码。

【讨论】:

以上是关于Laravel Eloquent builder 查询日志的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.1 中 Eloquent 和 Query Builder 有啥区别?

laravel Builder scope count() 出错 Eloquent/Builder.php 1185行

Laravel API ResourceCollection - 调用未定义的方法 Illuminate\Database\Eloquent\Builder::mapInto()

如何使用 Laravel Eloquent 和 Laravel Query Builder 进行联合查询?

Laravel Query:为 Query Builder 实现 Eloquent Scope

Laravel Eloquent ORM 与 Query builder 哪个更好?