2016-01-23 101 views
2

我有很多模型,并且我相信设置了正确的关系。Laravel Eloquent基于关系域只检索某些行

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

我已经尝试了一些变化,但无济于事。

下面是设置。

该表的问题叫做device,它指向一个名为dep的表。

DEVICE模型具有以下关系到DEP

public function dep() { 

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

} 

DEP模型有一个称为active柱,其被设置为truefalse

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

目前我必须获得所有DEP型号,然后只有在活动字段设置为true的情况下才能获得设备,但我确定必须采用更优雅的方法。

谢谢。

回答

0

如果您想根据是否存在限制结果一个相关模型中的字段,你想看看whereHas方法。

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

这将得到与真正的active领域dep所有设备。尽管如此,这不会取dep以及Device。如果你想要的,那么就使用whereHas与预先加载,你通常会做这样的:

$devices = Device::with('dep')->whereHas('dep', function($query) { 
    $query->where('active', '=', true); 
})->get(); 
+0

轰!这完成了,谢谢。 – Andy

3

您可以将过滤器简单地添加到您的关系:

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

或者,如果你喜欢保持dep关系不变,可以考虑添加其他关系只检索活动机型:

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

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

可以使用的关系如下:

$depActives = $device->depActive; 

$depActives = $device->depActive()->get(); 

他们嘘会做同样的

+0

很有意思,谢谢你。但是,Eloquent命令将只获得那些DEP活动字段为真的设备?我试过,DEP :: depActive()...但得到了以下错误:非静态方法App \ Device :: depActive()不应被静态调用,假设$ this来自不兼容的上下文 – Andy

+0

实际代码行是: $ data [] = Device :: depActive() - > get();导致“非静态方法App \ Device :: depActive()不应被静态调用,假设$ this来自不兼容的上下文”错误。 – Andy

+0

我实际上想要DEP处于活动状态的所有DEVICE模型。在这种情况下,我根本不需要DEP模型。我希望这是有道理的? – Andy