我有很多模型,我相信我的关系设置正确。
当且仅当外键表的active
列为真时,我想从表中检索所有模型。
我尝试过多种变化但无济于事。
以下是设置。
该表的问题称为device
,它指向名为dep
的表。
DEVICE
模型与DEP
public function dep() {
return $this->belongsTo('App\Dep');
}
DEP
模型有一个名为active
的列,设置为true
或false
。
我应该使用什么雄辩的命令来返回Devices
表的active
字段为真的所有DEP
?
目前我必须获得所有DEP
模型,然后只有在活动字段设置为true时才能获取设备,但我确信必须有更优雅的方法。
感谢。
答案 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