2016-07-01 4 views
2

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

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

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

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

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

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

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

Спасибо!

ответ

3

Существует гораздо лучше, и вы были близки ...

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

Awesome, спасибо за быстрый ответ! – MarvinVK

1

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

// Category.php 

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

При использовании контроллера:

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

Я полагаю, что это должно быть 'ownToMany', потому что другой конец также принадлежит' ownToMany' – user3158900

+0

Да, вы правы, потому что это отношения «Многие многие». Я отредактирую свой ответ. благодаря –

Смежные вопросы