Php Laravel在有说服力的查询日志上执行无限循环

Php Laravel在有说服力的查询日志上执行无限循环,php,laravel,eloquent,scopes,laravel-7.x,Php,Laravel,Eloquent,Scopes,Laravel 7.x,我制作了一个示波器,它以某种方式结束在一个无休止的循环中。在将其简化为最小可复制示例的同时,我得出以下结论: public function apply(Builder $builder, Model $model) { Log::info('[Search] SQL: ' . $builder->toSql() . " Bindings: " . implode(', ', $builder->getBindings())); } 该范围以标准方式在模

我制作了一个示波器,它以某种方式结束在一个无休止的循环中。在将其简化为最小可复制示例的同时,我得出以下结论:

public function apply(Builder $builder, Model $model)
{
    Log::info('[Search] SQL: ' . $builder->toSql() . " Bindings: " . implode(', ', $builder->getBindings()));
}
该范围以标准方式在模型中实现:

protected static function booted()
{
    static::addGlobalScope(new AuthorizationScope());
}
如果像这样运行代码,则会出现以下错误:

已达到最大函数嵌套级别“256”,正在中止

为什么不可能在作用域内获取SQL转储?这是否可以修改? 诸如在其他地方启用DB查询日志之类的选项并不是这个问题的一部分。

按照建议深入挖掘,我回答说这确实是一个递归调用

由于
toSql()
不是一个
雄辩的\Builder
方法,而是一个
Query\Builder
方法,它通过
\uu call()
magic方法得到转发,在这种情况下,需要在实际执行作用域之前获得一个应用作用域的查询生成器实例

public function toBase()
{
    return $this->applyScopes()->getQuery();
}
再往下一行,apply scopes调用
apply()
方法,该方法返回到我的代码,该代码会一次又一次地触发相同的事件:

if ($scope instanceof Scope) {
    $scope->apply($builder, $this->getModel());
}
因此,在回答我自己的问题时,由于以下原因,我不可能做我想做的事情。

按照建议深入挖掘,我回答说这确实是一个递归调用

由于
toSql()
不是一个
雄辩的\Builder
方法,而是一个
Query\Builder
方法,它通过
\uu call()
magic方法得到转发,在这种情况下,需要在实际执行作用域之前获得一个应用作用域的查询生成器实例

public function toBase()
{
    return $this->applyScopes()->getQuery();
}
再往下一行,apply scopes调用
apply()
方法,该方法返回到我的代码,该代码会一次又一次地触发相同的事件:

if ($scope instanceof Scope) {
    $scope->apply($builder, $this->getModel());
}

因此,在回答我自己的问题时,由于以下原因,不可能实现我想要的功能。

在构建SQL时,是否应用了全局作用域?您的
toSql
只是激活一个递归调用,一次又一次地调用作用域函数。可能是的。所以我想没有办法打印出来,除非在查询端?显然。也许可以深入了解一下Builder类。我相信有一个
baseQuery
函数,也许它可以使用它。(现在无法检查)。事实上,我不确定你想要实现什么。创建日志是因为要调查某些内容,但要检查什么?在生成SQL时是否应用了全局作用域?您的
toSql
只是激活一个递归调用,一次又一次地调用作用域函数。可能是的。所以我想没有办法打印出来,除非在查询端?显然。也许可以深入了解一下Builder类。我相信有一个
baseQuery
函数,也许它可以使用它。(现在无法检查)。事实上,我不确定你想要实现什么。你创建日志是因为你想调查一些事情,但是你想检查什么呢?