У меня есть приложение где можно создавать товары и категории для товаров. Использую отношения многие ко многим с дополнительной таблицей в БД где хранятся связи.
Модель Продуктов
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"?
Буду рад любой информации. Может у вас есть ссылка на хороший источник или туториал.....Если есть пример с кодом то вообще круто будет)