Laravel Global Scope不使用嵌套的地方

时间:2014-10-16 08:25:24

标签: php laravel orm laravel-4 eloquent

我正在尝试使用由特征加载到特定模型的范围,以便它在该模型的每个查询中执行

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();

那么这里有什么问题? 看起来构建器不喜欢使用函数,因为它放在函数中并不重要,它只是不起作用

2 个答案:

答案 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);
    });
}