Лучший подход для поиска из сводной таблицы с использованием 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