1

我制作了一个以某种方式以无限循环结束的范围。在将其简化为最小的可重现示例时,我想到了这一点:

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 转储?这可以以某种方式修改吗?在其他地方启用数据库查询日志等选项并不是这个问题的真正一部分。

4

1 回答 1

0

正如Maarten建议的那样深入挖掘让我回答说这确实是一个递归调用。

由于toSql()不是一种Eloquent\Builder方法,而是一种方法,Query\Builder因此它通过魔术方法被转发__call(),在这种情况下,它需要在实际执行范围之前获取应用范围的查询构建器实例:

public function toBase()
{
    return $this->applyScopes()->getQuery();
}

再往下,应用范围调用apply()返回到我的代码的方法,该方法再次触发相同的事情:

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

所以回答我自己的问题,由于以下原因,不可能做我想做的事。

于 2020-08-22T07:05:58.863 回答