Laravel many to many?

Добрый вечер! Обьясните пожалуйста, как мне себя вести с отношениями many to many. Допустим я хочу сделать фильтр, по продуктам. Для этого у меня есть 3 таблицы:
products: id, title,price,category,brand
attributes: id, title
products_attributes: id, product_id, attribute_id, value

Допустим я пишу ModelProduct::where('category', 3)->get();
Я получу все записи с category=3, но если мне нужно, скажем получить все записи где category=3 и где значение таблицы products_attributes:value=1

Если я напишу ModelProduct::where('category', 3)->attrs()->wherePivot('value', 1)->get();
Я получу ошибку, потому что билдер ModelProduct не знает ничего об отношении attrs. Но если определю отношение следующим образом
public function attrs($q)
    {
        return $this->belongsToMany('\App\Models\ModelAttributes','products_attributes','product_id','attribute_id')->withPivot('value')->WherePivot('value',$q);
    }


И буду использовать метод with, я все равно не смогу передать аргумент в attrs
ModelProduct::where('category', 3)->with('attrs'); (Ведь я не имею возможности передать аргумент, верно?)

Вообщем, прошу помощи, как построить сложный запрос с отношением многие к многим, так, чтобы я мог отфильтровать продукты по значениям, самой таблицы с продуктами, либо только по значениям связанной с подуктами таблицей, products_attributes либо attributes?
Благодарен за помощь!
  • Вопрос задан
  • 437 просмотров
Решения вопроса 1
@Ka4_Piton Автор вопроса
Вообщем решение довольно простое. К запросу добавляем следующее
$products->WhereHas('attrs', function($q){
                $q->where('value', '3' );
            });


В конечном итоге запрос, который решает мою проблему, будет выглядеть следующим образом:
ModelProduct::whereIn('category',$cats)->whereHas('attrs', function($q){
            $q->where('column', 'value');
        })->latest()->get();

Прописывать withPivot в отношении attrs, совсем не обязательно, можно так
public function attrs($q)
    {
        return $this->belongsToMany('\App\Models\ModelAttributes','products_attributes','product_id','attribute_id')->withPivot('value');
    }

а можно так
public function attrs($q)
    {
        return $this->belongsToMany('\App\Models\ModelAttributes','products_attributes','product_id','attribute_id');
    }

Но учтите, если вы хотите получить доступ к свойствам промежуточной модели, то в отношении нужно указывать withPivot('поля к которым хотите получить доступ')
Очень рад, что сам нашел решение, но тостер все еще замечательный, удобный и полезный резурс. Надеюсь, кому-то будет полезно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы