Лучший подход для поиска из сводной таблицы с использованием Laravel

Поиск из сводной таблицы с помощью Laravel.

Вот моя структура таблицы:

Product
id
name

Categories
id
name

product_category (Pivot table)

id
category_id
product_id

//products can have multiple categories 

Модель продукта:

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

Каков наилучший способ поиска всех продуктов по идентификатору категории? В настоящее время я делаю так, и это кажется неэффективным способом:

//Controller
$categories = product_category::where('category_id',1)->get();

Теперь я должен пройтись по категориям, а затем получить продукты и передать их на просмотр? Есть идеи, как сделать это эффективно?

2 ответа

Решение

Для этого вы можете использовать метод whereHas():

$categoryId = 1;

$products = Product::whereHas('categories', function ($query) use($categoryId) {
    $query->where('id', $categoryId);
})->get();    

Выше будет возвращать все продукты, которые находятся в категории, где идентификатор равен $categoryId,

Вы можете использовать это внутри своего метода в контроллере... это работает только тогда, когда $request->$query(search) имеет значение. Тогда здесь мы используем wereHas для получения отношения модели и с ->() using для получения значений сводной таблицы

->when($request->query('search'), function ($query)use($request) {

   $q= $request->query('search');

   return $query->whereHas('relation name', function (Builder $query) use ($q) {
                  
   $query->with('pivot table name.column name')  

  ->where('pivot table name.column name', 'like', "%{$q}%")
     });})

Вы можете загружать продукты для данной категории. Пытаться:

$category = Category::with('products')->where('category_id',1)->find(1);

Когда вы сделаете это, будут выполнены только 2 запроса к базе данных: один для загрузки категории и один для загрузки связанных продуктов.

Тогда в вашем Blade-представлении вы можете сделать:

@foreach($category->products as $product
    {{ $product->name }}
@endforeach
Другие вопросы по тегам