Как отфильтровать товары по категории?

У меня есть приложение где можно создавать товары и категории для товаров. Использую отношения многие ко многим с дополнительной таблицей в БД где хранятся связи.

Модель Продуктов
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $table = 'products';
    protected $guarded = false;

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

Модель категорий
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $table = 'categories';
    protected $guarded = false;

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


Миграция Категорий
public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->timestamps();
        });
    }

Миграция Продуктов
public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable();
            $table->string('description')->nullable();
            $table->timestamps();
        });
    }

И таблица для связей
public function up()
    {
        Schema::create('category_product', function (Blueprint $table) {
            $table->id();
            $table->foreignId('category_id')->constrained('categories')->onDelete('cascade');
            $table->foreignId('product_id')->constrained('products')->onDelete('cascade');
            $table->timestamps();
        });
    }


Вопрос в том как сделать фильтр Товаров по категориям? Сейчас что бы вывести все товары на странице я обращаюсь в контролере к моделе товаров и выбираю все, затем через компакт вывожу на странице.
Пример:
public function __invoke()
    {
        $products = Product::all();
        return view('product.index',compact('products'));
    }

А как вывести только те товары у которых категория "Категория 1"?
Буду рад любой информации. Может у вас есть ссылка на хороший источник или туториал.....Если есть пример с кодом то вообще круто будет)
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Sing303
$products = Product::whereHas('categories', function ($query) {
        $query->where('title', 'Категория 1');
    })->get();
Ответ написан
@a0xh
$products = Product::query()->with('categories')->where('categories.id', $category->id)->get();


Но лучше сперва посмотреть сам SQL-запрос без where(/*...*/) и потом прописать алиас, типа: select('categories.id AS c.id'), чтобы с ID товаров не пересекалось.

А еще лучше — посмотреть какой-нибудь курс по SQL, тогда Eloquent ORM или Query Builder от Laravel вообще не будут представлять из себя что-то сложное, и непонятное.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы