我已经搜索了一段时间,却找不到答案,这是我得到的:

1- ShowCategory(ID和标题)

class ShowCategory extends Model
{
    public function shows()
    {
         return $this->belongsToMany(Show::class, 'category_show');
    }
}

2-显示(ID,标题和有效)
class Show extends Model
{
    public function categories()
    {
        return $this->belongsToMany(ShowCategory::class, 'category_show');
    }
}

因此,存在多对多关系,我需要检索所有至少具有与其相关的Show的ShowCategory元素,并按show.active过滤每个ShowCategory-> shows,仅返回处于 Activity 状态的秀

这是我想要做的:
 $categories = ShowCategory::whereHas('shows', function($query) {
        $query->where('shows.active', '=', true);
    })->get();

它仅过滤包括节目的ShowCategory,并且如果其中只有一个节目处于 Activity 状态,它将返回内部包含所有节目的类别,即使其他节目未处于 Activity 状态,我也需要过滤那些未处于 Activity 状态的节目。

我该怎么办?提前致谢

最佳答案

这需要whereHas()with()的组合。首先,whereHas()会将ShowCategory模型过滤为具有有效Show的模型,而with()子句将关系的结果限制为仅返回active:

$categories = ShowCategory::whereHas("shows", function($subQuery) {
    $subQuery->where("shows.active", "=", true); // See note
})->with(["shows" => function($subQuery){
    $subQuery->where("shows.active", "=", true);
}])->get();'

注意:您应该能够使用active而不是shows.active,但是要取决于该列是否在多个表上。

使用此查询,您将获得Collection模型的ShowCategory,每个模型都已加载了有效的Show模型,并可以通过->shows获得:
foreach($categories AS $category){
    dd($category->shows); // List of `active` Shows
}

09-25 20:45