我已经搜索了一段时间,却找不到答案,这是我得到的:
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
}