我制作了一個范圍,但不知何故最終陷入無限循環。在將其簡化為最小的可重現示例時,我得出了以下結論: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 轉儲?這可以以某種方式修改嗎?在其他地方啟用數據庫查詢日志之類的選項實際上并不是這個問題的一部分。
1 回答

拉莫斯之舞
TA貢獻1820條經驗 獲得超10個贊
我回答說這確實是一個遞歸調用。
由于toSql()
不是一種Eloquent\Builder
方法,而是一種方法Query\Builder
,因此它通過魔術方法轉發,在這種情況下,需要在實際執行范圍之前__call()
獲取應用范圍的查詢構建器實例:
public?function?toBase(){ ????return?$this->applyScopes()->getQuery(); }
再往下, applyscopes 調用apply()
返回到我的代碼的方法,該方法再次一遍又一遍地觸發相同的事情:
if?($scope?instanceof?Scope)?{ ????$scope->apply($builder,?$this->getModel()); }
所以回答我自己的問題,由于以下原因不可能做我想做的事。
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報
0/150
提交
取消