我正在尝试根据给定的类别来过滤“活动”,活动的类别是由belongsToMany关系给出的。
是否可以过滤活动以仅允许在$ categories数组中具有(或不具有)类别的活动?
主要在SO上搜索之后,我了解到可以在with语句内执行“行”函数,并且尝试使用“ wherePivotIn”修饰符,因为它会过滤枢轴“ id_category”在列表中,但是我在$ categories上收到未定义的变量错误。
如果这不起作用,有没有什么好的方法可以根据其关系之一过滤模型?
在控制器内部
public function get_activity_cat($categories_db){
$categories = [];
foreach (json_decode($categories_db) as $key => $value) {
array_push($categories, $value->id);
}
return Activity::select('id', 'name_spa', 'name_eng', 'price')
->with('covers')
->with('languages')
->with([ 'categories' => function($query){ $query->wherePivotIn('id_category', $categories); } ])
->get()
->toJson()
;
}
我的模特
class Activity extends Model
{
protected $primaryKey = 'id';
public function covers()
{
return $this->belongsToMany('App\Cover', 'activities_covers', 'id_activity', 'id_cover')
->select(array('id', 'name_spa', 'name_eng'));
}
public function languages()
{
return $this->belongsToMany('App\Language', 'activities_languages', 'id_activity', 'id_language')
->select(array('id', 'id_lang', 'lang_name'));
}
public function categories()
{
return $this->belongsToMany('App\Category', 'activities_categories', 'id_activity', 'id_category');
}
}
----编辑----
感谢LC Yoong的评论,未定义的变量错误已解决,但我没有解决方案。
该方法仅过滤关系的结果,但是当枢轴不在$ categories数组中时,该方法不会消除“活动”。
答案 0 :(得分:0)
您可以使用whereHas根据关联条件缩小结果范围。试试这个:
return Activity::select('id', 'name_spa', 'name_eng', 'price')
->whereHas('categories', function($q) use ($categories ){
$q->whereIn('id', $categories);
})
->with(['covers', 'languages', 'categories'])
->get()
->toJson();