我正在尝试使用由特征加载到特定模型的范围,以便它在该模型的每个查询中执行
BUT
查询无效
public function apply(Builder $builder) {
$builder->where(function($q){$q->whereIn('region_id', array(1,2))
->orWhere('manager_id', 1);
});
}
这是应该做的但是页面没有加载,所以我检查了apache错误日志并获得了:
[core:notice] [pid 949] AH00051: child pid 2647 exit signal Segmentation fault (11), possible coredump in /etc/apache2
BUT 如果我将同一个creteria应用于一个查询,那么它可以工作:S
Client::where(function($q){
$q->whereIn('region_id', array(1,2))
->orWhere('manager_id', 1);
})->get();
那么这里有什么问题? 看起来构建器不喜欢使用函数,因为它放在函数中并不重要,它只是不起作用
答案 0 :(得分:3)
解决方案 - 使用whereNested
:
public function apply(Builder $builder) {
$builder->whereNested(function ($q) {
$q->whereIn('region_id', array(1,2))
->orWhere('manager_id', 1);
});
}
说明:
$builder->where
Eloquent\Builder
方法,导致无限循环,因为它调用没有作用域的新查询,调用新查询,首先启动作用域......
虽然:
$builder->whereNested
underyling Query\Builder
方法,它按预期工作。函数调用将转发到Query\Builder
对象,因为whereNested
上缺少Eloquent\Builder
方法,以及魔术__call
方法。
答案 1 :(得分:1)
我不是这方面的专家,但在第一个解决方案中,您没有$q
定义我认为它不会起作用。您可以尝试:
public function apply(Builder $builder) {
$builder->whereIn('region_id', array(1,2))->orWhere('manager_id', 1);
}
或
public function apply(Builder $builder) {
$builder->where(function() use $builder {$builder->whereIn('region_id', array(1,2))
->orWhere('manager_id', 1);
});
}