【问题标题】:Laravel Eloquent Retrieving only certain rows basing on relation fieldLaravel Eloquent 根据关系字段仅检索某些行
【发布时间】:2016-04-29 22:58:45
【问题描述】:

我有许多模型,并且我相信我已经正确设置了关系。

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

我尝试了许多变体,但都无济于事。

下面是设置。

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

DEVICE 模型与 DEP 有如下关系

public function dep() {

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

}

DEP 模型有一个名为active 的列,该列设置为true 或false。

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

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

谢谢。

【问题讨论】:

    标签: php laravel orm laravel-5 eloquent


    【解决方案1】:

    您可以简单地为您的关系添加一个过滤器:

    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();
    

    他们都会做同样的事情

    【讨论】:

    • 非常有趣,谢谢。但是 Eloquent 命令将如何只获取 DEP 活动字段为真的那些设备?我试过了,DEP::depActive()... 但得到了以下错误:非静态方法 App\Device::depActive() 不应该被静态调用,假设 $this 来自不兼容的上下文
    • 实际的代码行是:$data[] = Device::depActive()->get();这导致“非静态方法 App\Device::depActive() 不应被静态调用,假设 $this 来自不兼容的上下文”错误。
    • 我实际上想要所有 DEP 处于活动状态的 DEVICE 模型。在这种情况下,我根本不需要 DEP 模型。我希望这是有道理的?
    • Doesn't "Devices::with('dep')->where('active', true)->get();"假设 DEVICES 表有一个活动字段?如果我没看错,它将返回带有 DEVICE 的 DEP 模型,并且只返回将“活动”字段设置为 true 的设备。我的设备表没有这样的字段。
    • 不,它会将Device 表与dep 表连接起来(使用您的dep 关系)然后它将通过active 字段过滤连接的表
    【解决方案2】:

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

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

    这将获取所有具有dep 且active 字段为true 的设备。不过,这不会与Device 一起获取dep。如果你想要这样,那么只需使用 whereHas 和像往常一样进行预加载:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 2019-12-11
      • 2022-07-27
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多