繁体   English   中英

Laravel Eloquent builder查询日志

[英]Laravel Eloquent builder query log

我为我们的 API 创建了一个JSON 搜索引擎

组装查询的逻辑如下;

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

/**
 * @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()时,因此 model 与传递给它的关系一起加载,但是这永远不会反映在查询中。

我总是会得到SELECT * FROM table WHERE something ,而没有提及相关表。 有没有办法获得基础查询?

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

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

之后,您可以使用\DB::getQueryLog()获取记录的查询。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM