Laravel 预加载查询问题

Laravel eager loading Query issue

我在以下查询中遇到问题。查询 return 的结果在 eager 函数内没有 运行 条件。 虽然我们已经为 $from_code 和 $to_code 赋值,但它不会附加这些内部条件。它只是 return empperson table 中的所有数据,而不管分配的值 $from_code 和 $to_code .

$empPersons = Empperson::with(['empmaster' => function($query) use ($from_code,$to_code){
    if($from_code !=""){
         $query->where('empmaster.empCode','>=',$from_code);
    }
    if($to_code !=""){
         $query->where('empmaster.empCode','<=',$to_code);
    }
}]);

我的Empmaster和Empperson模型如下。

Empmaster.php

class Empmaster extends Model
{
    protected $table = 'empmaster';

    public function empPerson()
    {
        return $this->hasOne('App\Empperson');
    }

}

Empperson.php

class Empperson extends Model
{
    protected $table = 'empperson';

    public function empMaster()
    {
        return $this->belongsTo('App\Empmaster','empmaster_id','id');
    }
}

因此,据我了解,您想用存在于这些条件下的关系来调节 Empperson 结果。那么你需要使用whereHas,而不是with

$empPersons = Empperson::whereHas('empmaster', function($query) use ($from_code,$to_code){
    if($from_code !=""){
         $query->where('empCode','>=',$from_code);
    }
    if($to_code !=""){
         $query->where('empCode','<=',$to_code);
    }
})->get();

with 只会 运行 条件 empmaster 结果。如果结果中仍然需要 empmaster 关系,则可以将两者结合起来。

$empPersons = Empperson::whereHas('empmaster', function($query) use ($from_code,$to_code){
    if($from_code !=""){
         $query->where('empCode','>=',$from_code);
    }
    if($to_code !=""){
         $query->where('empCode','<=',$to_code);
    }
})->with(['empmaster' => function($query) use ($from_code,$to_code){
    if($from_code !=""){
         $query->where('empCode','>=',$from_code);
    }
    if($to_code !=""){
         $query->where('empCode','<=',$to_code);
    }
}])->get();

所以实际上你可以设置条件 Empperson 并得到他们所有的 Empmaster 而不管条件如何。