Laravel雄辩的生成器查询日志

时间:2020-07-10 07:24:17

标签: php laravel eloquent laravel-query-builder laravel-7

我为我们的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()));

现在我遇到的问题是,在加载相关模型时(在请求参数之一(->with()中使用RelationsParameter),我确实得到了我想要的东西,所以模型被一起加载了具有传递给它的关系,但是从不反映在查询中。

我总是以SELECT * FROM table WHERE something结尾,而无需提及相关表格。有没有办法获取基础查询?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

因此,目前,不可能在与查询生成器一起运行时转储整个SQL。

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