سلام
در لاراول میتونیم محصولات رو دسته بندی کنیم به این شکل:
لوازم الکترونیکی->کامپیوتر->موس
میخوام ببینم چطور میشه روی لوازم الکترونیک کلیک کرد بر روی محصولات موس رو دید چون که در کالا ما فقط یک category_id داریم و در خود category هم یک parent_id داریم
@navids
میتونید از یک table میانی با عنوان category_product هم استفاده کنید که هر محصول بتونه مربوط به چن تا دسته بندی باشه که هر کدوم از دسته بندی ها انتخاب شد بتونیم به محصول دسترسی داشته باشیم
درود
بسیار ساده است .دسته بندی ماوس در واقع یکی از descendant های دسته بندی لوازم الکترونیکی میشه. با اسکوپ descendantsOf در مدل Category از پکیج Laravel Categorizable میتونید دسته بندی های تو در تو رو پیدا و محصولات مرتبط با اون ها رو لود و یا eagerload کنید.
توضیحات کامل در گفتگوی زیر
https://roocket.ir/discuss/6117
ممنون از @ali.bayat @Alimotreb @mr.zarrin1994
با سرچی که دیروز تو so زدم ، این کد رو دیدم و به نتیجه رسیدم:
<?php
namespace App;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
//
public function children()
{
return $this->hasMany(self::class, 'parent_id');
}
public function grandchildren()
{
return $this->children()->with('grandchildren');
}
public function products()
{
return $this->hasMany(Product::class);
}
public function all_products()
{
$products = [];
$categories = [$this];
while(count($categories) > 0){
$nextCategories = [];
foreach ($categories as $category) {
$products = array_merge($products, $category->products->all());
$nextCategories = array_merge($nextCategories, $category->children->all());
}
$categories = $nextCategories;
}
$collection = new Collection($products); //Illuminate\Database\Eloquent\Collection
$collection = $collection->sortBy('view');
return $collection;
}
}
با کد بالا فقط کافیه شما تو هر دسته بندی دسته بندی parent_id اونو مشخص کنید ، این کد خودش تمامی زیر دسته ها رو پیمایش میکنه به شکل زیر
لوازم الکترونیکی -> کامپیوتر -> موس -> بیسیم
و محصولاتشون رو لود میکنه
رای نمایش محصولات هم کافیه این کد رو بزنید
Route::get('category/{category}',function (\App\Category $category){
return $category->all_products();
});
در صورتی که مثلا به دسته موس وارد شویم فقط محصولات موس و دسته بندی های زیرش رو نشون میده ، و اگه کامپیوتر رفتیم هم زیرمجموعه ها و زیرمجموعه هاشون رم میگیره و محصولاتشون رو نشون میده
در صورتی هم که بخواهید یک دسته بندی با تموم زیرمجموعه ها به صورت سطح بندی نشان دهید کد زیر کمکتون میکنه
Route::get('cat',function (){
$cat = \App\Category::with('grandchildren')->where('parent_id',0)->get();
return $cat;
});
کد بالا دسته بندی ها و زیرمجموعه ها رو نشون میده
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟