Как фильтровать данные, используя отношение многие-ко-многим в Laravel?

Рейтинг: 0Ответов: 0Опубликовано: 23.07.2023

Всем привет! Бьюсь уже 2 дня, но никак не могу решить задачу.

Есть таблица товаров, категорий, цветов и т.д. Также есть промежуточные таблицы для всех вышеперечисленных.

Для наглядности:

Таблица продуктов:

Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('title', 100);
            $table->integer('price')->index()->nullable();

            $table->timestamps();
            $table->softDeletes();
        });

Таблица категорий

Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('title', 100);

            $table->timestamps();
            $table->softDeletes();
        });

Таблица цветов

Schema::create('colors', function (Blueprint $table) {
            $table->id();
            $table->string('title', 100);

            $table->timestamps();
            $table->softDeletes();
        });

Таблицы отношений:

Schema::create('category_product', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('product_id')->unsigned()->index();
            $table->foreign('product_id')->references('id')->on('products');
            $table->bigInteger('category_id')->unsigned()->index();
            $table->foreign('category_id')->references('id')->on('categories');
            $table->timestamps();
        });
Schema::create('color_product', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('product_id')->unsigned()->index();
            $table->foreign('product_id')->references('id')->on('products');
            $table->bigInteger('color_id')->unsigned()->index();
            $table->foreign('color_id')->references('id')->on('colors');
            $table->timestamps();
        });

В модели категории:

public function products()
    {
        return $this->belongsToMany(Product::class);
    }

В модели продукта:

public function categories()
    {
        return $this->belongsToMany(Category::class);
    }
public function colors()
    {
        return $this->belongsToMany(Color::class);
    }

Никак не могу понять, как, к примеру найти товары, у которых следующий запрос: Категория = кроссовки + Цвет = красный или зеленый

Работает такой запрос:

$category = Category::where('title', 'кроссовки')
            ->first();
$products = $category->products;

Но это не верно. Так как нужно получить записи с остальными связями, то есть куда-то прописать

->with('categories',  'genders', 'brands', 'colors', 'materials')

ну и у меня запрос не только по категории, а еще и по цветам. Еще работает такой запрос (с with), но тут я не могу понять, как добавить сортировку по категории и бренду:

        $products = Product::query()
            ->with('categories',  'genders', 'brands', 'colors', 'materials')
            ->get();

Любая помощь будет полезна)) Вроде задача то примитивная, но никак не могу справиться.

Ответы

Ответов пока нет.