Laravel Eloquent 构建器查询日志
Laravel Eloquent builder query log
我已经为我们的 API 制作了 JSON search engine。
组装查询的逻辑如下;
Laravel 宏用于在 Eloquent 模型上启用搜索方法,该模型创建 class 的实例并运行搜索方法:
/**
* @var $this Builder
*/
$searcher = new Searcher($this, $request);
$searcher->search();
为了保持分离,具有 URL 查询逻辑的请求参数 class 是动态实例化的,并且具有与依赖项相同的查询构建器。在 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
结尾,而没有提及相关的 table。是否也有获取底层查询的方法?
您可以将代码包装在 Laravel 的查询记录器周围:
\DB::connection()->enableQueryLog();
// your code
\DB::connection()->disableQueryLog();
之后,您可以使用 \DB::getQueryLog()
获取记录的查询。
但是,如果您只想在开发时登录,我会使用 barryvdh/laravel-debugbar 包。
我一直在 Laravel 本身进行更深入的挖掘,而 toSql()
方法为什么不转储关系 SQL 这个问题的答案是因为它得到在触发 eagerLoadRelations
方法之前编译。
所以目前,在使用查询构建器操作时,不可能转储整个SQL。
halloei 的建议将转储所有已执行的查询,但是这在这一点上对我没有帮助,因为它需要我在包外添加代码。
我已经为我们的 API 制作了 JSON search engine。
组装查询的逻辑如下;
Laravel 宏用于在 Eloquent 模型上启用搜索方法,该模型创建 class 的实例并运行搜索方法:
/**
* @var $this Builder
*/
$searcher = new Searcher($this, $request);
$searcher->search();
为了保持分离,具有 URL 查询逻辑的请求参数 class 是动态实例化的,并且具有与依赖项相同的查询构建器。在 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
结尾,而没有提及相关的 table。是否也有获取底层查询的方法?
您可以将代码包装在 Laravel 的查询记录器周围:
\DB::connection()->enableQueryLog();
// your code
\DB::connection()->disableQueryLog();
之后,您可以使用 \DB::getQueryLog()
获取记录的查询。
但是,如果您只想在开发时登录,我会使用 barryvdh/laravel-debugbar 包。
我一直在 Laravel 本身进行更深入的挖掘,而 toSql()
方法为什么不转储关系 SQL 这个问题的答案是因为它得到在触发 eagerLoadRelations
方法之前编译。
所以目前,在使用查询构建器操作时,不可能转储整个SQL。
halloei 的建议将转储所有已执行的查询,但是这在这一点上对我没有帮助,因为它需要我在包外添加代码。