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();

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

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

Спасибо!

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