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?
Благодарен за помощь!
  • Вопрос задан
  • 80 просмотров
Решения вопроса 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('поля к которым хотите получить доступ')
Очень рад, что сам нашел решение, но тостер все еще замечательный, удобный и полезный резурс. Надеюсь, кому-то будет полезно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Amigoweb Магнитогорск
от 50 000 до 70 000 руб.
Ready for Sky Санкт-Петербург
от 110 000 до 120 000 руб.