首页 > 解决方案 > Laravel 急切加载查询问题

问题描述

我在以下查询中有问题。查询返回结果,无需在 Eager 函数内运行条件。尽管我们已经为 $from_code 和 $to_code 赋值,但它并没有附加这些内部条件。它只返回 empperson 表中的所有数据,而不管分配的值 $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');
    }

}

工作人员.php

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

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

标签: phplaraveleloquenteager-loading

解决方案


因此,据我了解,您希望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,而不管条件如何。


推荐阅读