【问题标题】:Laravel eager loading Query issueLaravel 急切加载查询问题
【发布时间】:2019-08-27 09:07:29
【问题描述】:

我在以下查询中有问题。查询返回结果,无需在 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');
    }

}

Empperson.php

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

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

【问题讨论】:

    标签: php laravel eloquent eager-loading


    【解决方案1】:

    据我了解,您希望使用在这些条件内存在的关系来调整 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。

    【讨论】:

    • empCode 字段存在于 empmaster 表中。
    • @GayanFernando 想通了,你试过答案了吗?
    • 抱歉回复晚了。我现在刚刚测试它并且它有效。非常感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2020-02-26
    • 2014-06-12
    • 2014-08-13
    相关资源
    最近更新 更多