Laravel 全局查询范围抛出已达到最大函数嵌套级别
Laravel global query scope throws max function nesting level reached
我正在尝试替换 query scope with a global query scope,但是虽然我的查询范围工作正常,但全局范围导致以下异常:
Symfony \ Component \ Debug \ Exception \ FatalErrorException (E_ERROR)
Maximum function nesting level of '100' reached, aborting!
这是我的全局范围 apply()
方法
public function apply(Builder $builder)
{
$builder->whereHas('lifetime', function($query)
{
$query->whereNested(function($query)
{
$query->whereNull('lifetimes.days')
->orWhereRaw('NOW() < DATE_ADD(updated_at, INTERVAL lifetimes.days DAY)');
});
});
}
我只是把原来查询范围内的代码提取出来放在这里
问题出在 whereHas()
方法上,它的回调从未被调用过,如果我用另一个查询构建方法(如 where('col', 'value')
替换它,就不会有错误
事实上,它间接调用模型上的 getQuery()
,然后用 Model::__call()
处理,然后在模型上再次调用全局范围,包括我的模型,并导致永无止境的递归调用。
堆栈帧(从上到下):
- 模型::全部()
- 模型->newQuery()
- 模型->applyGlobalScopes()
- MyScope->应用()
- 生成器->whereHas()
- 生成器->有()
- Relations\BelongsTo->getRelationCountQuery()
- Relations\Relation->wrap()
- MyModel->getQuery()
- 型号->__call()
- 模型->newQuery()
- 模型->applyGlobalScopes()
- MyScope->应用()
- 生成器->whereHas()
....
他们已经解决了这个问题。 issue on github
我正在尝试替换 query scope with a global query scope,但是虽然我的查询范围工作正常,但全局范围导致以下异常:
Symfony \ Component \ Debug \ Exception \ FatalErrorException (E_ERROR)
Maximum function nesting level of '100' reached, aborting!
这是我的全局范围 apply()
方法
public function apply(Builder $builder)
{
$builder->whereHas('lifetime', function($query)
{
$query->whereNested(function($query)
{
$query->whereNull('lifetimes.days')
->orWhereRaw('NOW() < DATE_ADD(updated_at, INTERVAL lifetimes.days DAY)');
});
});
}
我只是把原来查询范围内的代码提取出来放在这里
问题出在 whereHas()
方法上,它的回调从未被调用过,如果我用另一个查询构建方法(如 where('col', 'value')
替换它,就不会有错误
事实上,它间接调用模型上的 getQuery()
,然后用 Model::__call()
处理,然后在模型上再次调用全局范围,包括我的模型,并导致永无止境的递归调用。
堆栈帧(从上到下):
- 模型::全部()
- 模型->newQuery()
- 模型->applyGlobalScopes()
- MyScope->应用()
- 生成器->whereHas()
- 生成器->有()
- Relations\BelongsTo->getRelationCountQuery()
- Relations\Relation->wrap()
- MyModel->getQuery()
- 型号->__call()
- 模型->newQuery()
- 模型->applyGlobalScopes()
- MyScope->应用()
- 生成器->whereHas() ....
他们已经解决了这个问题。 issue on github