Laravel получить все записи, которые имеют категорию

Так что я боролся с этим некоторое время сейчас.
Я не хочу получать все «продукты», которые содержат определенный стержень category,

Итак, у меня есть маршрут:

Route::get('products/{category}', ['as' => 'category.products', 'uses' => 'ProductsController@getCatProducts']);

И модель продукта с:

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

И тогда мой контроллер:

public function getCatProducts($categoryUrl)
{
$products = Product::get();

$productsWithCat = [];

// loop through all projects
foreach($products as $product) {

// loop through all categories assigned to product
$categories = $product->categories;
foreach($categories as $category) {

// check if product has category from url
if ($category->title == $categoryUrl) {
array_push($productsWithCat, $product);
}
}
}

$category = $categoryUrl;
$products = $productsWithCat;

return view('pages.category-products', compact('products', 'category'));
}

Так что это работает, но, вероятно, есть гораздо лучший способ сделать это.
Что-то вроде:

$products = Product::with('categories.title', $categoryUrl)->get();

Также мой путь возвращает массив, а не коллекцию, так что я даже не могу добраться до категорий в моем блейде.

Я надеюсь, что кто-то может мне помочь.

Спасибо!

2

Решение

Есть гораздо лучший способ, и вы были близки …

$products = Product::with('categories')
->whereHas('categories', function($q) use ($categoryUrl) {
$q->where('title', $categoryUrl);
})->get();
3

Другие решения

Возможно, вам придется реализовать belongsToMany метод в модели Category, чтобы вернуть все коллекции продуктов, которые принадлежат этой определенной переданной категории вместе.

// Category.php

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

В контроллере используют:

$products = Category::with('products')->where('title', $categoryName)->get();
1

По вопросам рекламы [email protected]