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.
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 }
0 comments:
Post a Comment