我为我们的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
结尾,而无需提及相关表格。有没有办法获取基础查询?
答案 0 :(得分:0)
您可以将代码包装在Laravel的查询记录器周围:
\DB::connection()->enableQueryLog();
// your code
\DB::connection()->disableQueryLog();
之后,您可以使用\DB::getQueryLog()
来获取记录的查询。
但是,如果您只是想在开发时记录日志,我会使用barryvdh/laravel-debugbar软件包。
答案 1 :(得分:0)
我一直在深入Laravel本身,问题的答案是为什么toSql()
方法也不会转储关系SQL是因为它在触发eagerLoadRelations
方法之前已被编译
因此,目前,不可能在与查询生成器一起运行时转储整个SQL。
halloei的建议将转储所有执行的查询,但是这对我没有帮助,因为这需要我将代码添加到程序包之外。