Sunday, June 12, 2016

How to get many to many relationship items in laravel

Leave a Comment

There is a data structure for a e-shop:

Series -> (many to many) -> categories -> (many to many) -> products 

For example, series is "Outdoor Series" , categories is "t-shirt" , products are "t-shirt A, t-shirt B, etc... "

And here is the controller that list out products in one category

public function view($series = 0, $cat = 0, $page = 1) {         $category = Category::find($cat);          $totalItems = count($category->product);         $itemsPerPage = 30;         $currentPage = $page;         $urlPattern = "/ums/product/view/$series/$cat/(:num)";          $this->data['product_list'] = $category->product()->orderBy('created_at', 'desc')->skip(($page - 1) * $itemsPerPage)->take($itemsPerPage)->get();         $this->data['paginator'] = new Paginator($totalItems, $itemsPerPage, $currentPage, $urlPattern);         $this->data['category'] = $category;         $this->data['page'] = $page;         return view('product/list')->with($this->data);     } 

Now, the problem is , I would like to rewrite the code so that instead of showing one category, I would like to show one series as well.

That means if the $series = 0 , then it shows products in one category, if the $cat = 0, then it shows products in multi category

In laravel how to get the products in multi category? try $series->category->product() but no luck, also how to rewrite that function to support showing of the series?

Thanks a lot.

3 Answers

Answers 1

Assuming Laravel Model classes - Series, Category and Product

For the Series Model Class, create a function

   public function categories()    {         return $this->belongsToMany('App\Category');    } 

For the Category Model Class, create a function

   public function products()    {         return $this->belongsToMany('App\products');    } 

Now for a given Series, you can easily retrieve all related categories using the simple function call

$categories = $series->categories(); 

Finally coming to the main problem of showing products under multiple categories.

for($categories as $category) {      $productsOfThisCategory = $categories->products();      //save into some other data structure, say an array $allProducts } 

$allProducts will have multi-category products for a specific Series.

Refer : Standard eloquent relationship -Many to Many

Answers 2

You can use this answer for sorting.

How to sort by a field of the pivot table of a many-to-many relationship in Eloquent ORM

Answers 3

If I understand you correctly, then your models looks like below

class Series extends Model {      // other code      public function categories() {         return $this->belongsToMany('App\Category');     }      // other code }  class Category extends Model {      // other code      public function series() {         return $this->belongsToMany('App\Series');     }      public function products() {         return $this->belongsToMany('App\Product');     }      // other code }  class Product extends Model {      // other code      public function categories() {         return $this->belongsToMany('App\Category');     }      // other code } 

Further to get all products of certain series you need to do so

public function view($series = 0, $cat = 0, $page = 1) {     if (!empty($series)) {         $seria = Series::with(['categories' => function($query) {             $query->with('products');         })->find($series);         // or may be this will work, don't know         // Series::with('categories.products')->find($series);          // get all caegories from seria or certain one         if (empty($cat)) {             $categories = $seria->categories;          }         else {             $categories = $seria->categories()->where('id', $cat)->get;          }          // retrieve produts form each category and making from them collection         $products = $categories->map(function($category) {             return $category->products;         })->flatten();          // or use this approach if above not working         /*$products = collect([]);          foreach ($categories as $category) {             $produts = $products->merge($category->products);         }*/          // do your magic     }     else {         // not exactly understand what you want to do when $series is not set     }      // do your magic } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment