获取在关系中具有特定值的模型

问题描述 投票:0回答:1

我试图根据给定的类别过滤“活动”,活动的类别由belongsToMany关系给出。

是否可以过滤活动以仅允许包含(或不包含)数组 $categories 中的类别的活动?

在主要搜索SO之后,我了解到可以在with语句内执行“line”函数,并且我尝试使用“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 数组中时,它不会排除“活动”。

php laravel laravel-5 eloquent
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.