【发布时间】:2020-11-08 15:56:19
【问题描述】:
我制作了一个以某种方式以无限循环结束的作用域。在将其简化为最小的可重现示例时,我想到了:
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 转储?这可以以某种方式修改吗? 在其他地方启用数据库查询日志等选项并不是这个问题的一部分。
【问题讨论】:
-
在构建 SQL 时是否应用了全局范围?您的
toSql只是激活了一个递归调用,一次又一次地调用作用域函数。 -
可能是的。所以我想除非在查询结束,否则没有办法打印出来?
-
显然。也许深入挖掘 Builder 类。我相信有一个
baseQuery函数,也许它适用于它。 (现在无法检查)。我实际上不确定您要达到的目标。您创建日志是因为您想调查某事,但您想检查什么?
标签: php laravel eloquent scopes laravel-7.x