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
Author: cdomination, 2016-07-01
2 answers
Есть гораздо лучший способ, и ты был близок...
$products = Product::with('categories')
->whereHas('categories', function($q) use ($categoryUrl) {
$q->where('title', $categoryUrl);
})->get();
3
Author: user3158900, 2016-07-01 12:33:11
Возможно, вам потребуется реализовать метод belongsToMany в модели категорий, чтобы вернуть всю коллекцию продуктов, принадлежащих к этой конкретной переданной категории, вместе.
// Category.php
public function products()
{
return $this->belongsToMany(Product::class);
}
В контроллере используйте:
$products = Category::with('products')->where('title', $categoryName)->get();
1
Author: hasusuf, 2016-07-01 23:50:07