为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕丝7291255 2023-08-11 16:29:52
我制作了一个范围,但不知何故最终陷入无限循环。在将其简化为最小的可重现示例时,我得出了以下结论: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());
}

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


查看完整回答
反对 回复 2023-08-11
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号