请参阅Laravel雄辩范围中的关系

时间:2019-02-14 15:33:21

标签: php laravel eloquent

Laravel 5.7。我有一个模型Cat,带有属性visible,并有一个检查可见性的范围:

class Cat extends Model
{
    public function scopeVisible($query)
    {
        return $query->where('visible', true);
    }

    public function fleas()
    {
        return $this->hasMany('App\Flea');
    }
}

我有第二个模型Flea

class Flea extends Model
{
    public function cat()
    {
        return $this->belongsTo('App\Cat');
    }
}

我想为Flea添加一个类似的可见性范围,这样我就可以做类似$fleas = Flea::visible()->get()的事情,它只会返回属于可见猫的跳蚤。但是我不确定如何在Cat的scope方法中引用父项Flea

编辑:我尝试在cat()上的scopeVisible方法中访问Flea关系,但是我从Laravel收到此错误:

  

Eloquent构建器实例上不存在属性[cat]。

2 个答案:

答案 0 :(得分:3)

使用whereHas()

class Flea extends Model
{
    public function cat()
    {
        return $this->belongsTo('App\Cat');
    }

    public function scopeVisible($query)
    {
        return $query->whereHas('cat', function($query) {
            $query->visible();
        });
    }
}

然后就做:

Flea::visible()->get();

答案 1 :(得分:0)

您可以编写自己的查询:

$fleas = Flea::whereHas('cat', function($q) {
    $q->where('visible', true);
})->get();

或使用Cat模型:

$cats = Cat::visible()->get();

foreach($cats as $cat) {
    foreach ($cat->fleas as $flea) {
        // only fleas with visible cats
    }
}

您可以将查询用作Flea模型中的本地范围。