Laravel 范围无限循环 eloquent 查询日志
Laravel scopes endless loop on eloquent query log
我制作了一个范围,但不知何故陷入了无限循环。在将它简化为最小的可重现示例的同时,我得出了这个:
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());
}
如果我 运行 这样的代码,我会遇到以下错误:
Maximum function nesting level of '256' reached, aborting!
为什么无法在范围内获取 SQL 转储?这可以以某种方式修改吗?
诸如在其他地方启用数据库查询日志之类的选项实际上并不是这个问题的一部分。
按照 Maarten 的建议进行更深入的挖掘让我回答说这确实是一个递归调用。
因为 toSql()
不是 Eloquent\Builder
方法,而是 Query\Builder
方法,它通过 __call()
魔术方法转发,在这种情况下需要查询构建器实例应用范围 before 它实际执行范围:
public function toBase()
{
return $this->applyScopes()->getQuery();
}
更进一步,apply scopes 调用了 apply()
方法,该方法 returns 到我的代码,它再次一次又一次地触发同样的事情:
if ($scope instanceof Scope) {
$scope->apply($builder, $this->getModel());
}
所以回答我自己的问题,由于以下原因,我无法做我想做的事。
我制作了一个范围,但不知何故陷入了无限循环。在将它简化为最小的可重现示例的同时,我得出了这个:
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());
}
如果我 运行 这样的代码,我会遇到以下错误:
Maximum function nesting level of '256' reached, aborting!
为什么无法在范围内获取 SQL 转储?这可以以某种方式修改吗? 诸如在其他地方启用数据库查询日志之类的选项实际上并不是这个问题的一部分。
按照 Maarten 的建议进行更深入的挖掘让我回答说这确实是一个递归调用。
因为 toSql()
不是 Eloquent\Builder
方法,而是 Query\Builder
方法,它通过 __call()
魔术方法转发,在这种情况下需要查询构建器实例应用范围 before 它实际执行范围:
public function toBase()
{
return $this->applyScopes()->getQuery();
}
更进一步,apply scopes 调用了 apply()
方法,该方法 returns 到我的代码,它再次一次又一次地触发同样的事情:
if ($scope instanceof Scope) {
$scope->apply($builder, $this->getModel());
}
所以回答我自己的问题,由于以下原因,我无法做我想做的事。