猿问

Laravel 在 eloquent 查询日志中作用于无限循环

我制作了一个范围,但不知何故最终陷入无限循环。在将其简化为最小的可重现示例时,我得出了以下结论:


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


慕丝7291255
浏览 93回答 1
1回答

拉莫斯之舞

我回答说这确实是一个递归调用。由于toSql()不是一种Eloquent\Builder方法,而是一种方法Query\Builder,因此它通过魔术方法转发,在这种情况下,需要在实际执行范围之前__call()获取应用范围的查询构建器实例:public function toBase(){     return $this->applyScopes()->getQuery(); }再往下, applyscopes 调用apply()返回到我的代码的方法,该方法再次一遍又一遍地触发相同的事情:if ($scope instanceof Scope) {     $scope->apply($builder, $this->getModel()); }所以回答我自己的问题,由于以下原因不可能做我想做的事。
随时随地看视频慕课网APP
我要回答