Laravel Eloquent仅基于关系字段检索某些行

时间:2016-01-23 09:54:48

标签: php laravel orm laravel-5 eloquent

我有很多模型,我相信我的关系设置正确。

当且仅当外键表的active列为真时,我想从表中检索所有模型。

我尝试过多种变化但无济于事。

以下是设置。

该表的问题称为device,它指向名为dep的表。

DEVICE模型与DEP

具有以下关系
public function dep() {

    return $this->belongsTo('App\Dep');

}

DEP模型有一个名为active的列,设置为truefalse

我应该使用什么雄辩的命令来返回Devices表的active字段为真的所有DEP

目前我必须获得所有DEP模型,然后只有在活动字段设置为true时才能获取设备,但我确信必须有更优雅的方法。

感谢。

2 个答案:

答案 0 :(得分:3)

您只需在您的关系中添加过滤器即可:

public function dep() {
    return $this->belongsTo('App\Dep')->where('active', true);
}

或者,如果您希望保持dep关系不变,则可以考虑添加另一个关系以仅检索活动模型:

public function depActive() {
    return $this->belongsTo('App\Dep')->where('active', true);
}

这将返回与DEP相关的所有Device模型,active = 1

您可以使用以下关系:

$depActives = $device->depActive;

$depActives = $device->depActive()->get();
他们会做同样的事情

答案 1 :(得分:1)

如果要根据相关模型中字段的存在来限制结果,您需要查看whereHas方法。

$devices = Device::whereHas('dep', function($query) {
    $query->where('active', '=', true); // Replace true with 1 if you aren't using casts
})->get();

这将使所有设备dep的{​​{1}}字段为true。但这不会与active一起获取dep。如果你想要那样,那么只需像往常一样使用Device加急切换:

whereHas