نوید
4 سال پیش توسط نوید مطرح شد
4 پاسخ

گرفتن لیست محصولات

سلام
در لاراول میتونیم محصولات رو دسته بندی کنیم به این شکل:

لوازم الکترونیکی->کامپیوتر->موس

میخوام ببینم چطور میشه روی لوازم الکترونیک کلیک کرد بر روی محصولات موس رو دید چون که در کالا ما فقط یک category_id داریم و در خود category هم یک parent_id داریم


ثبت پرسش جدید
Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 4 سال پیش مطرح شد
1

سلام
@navids

از دوستان راکتی ، یک پکیج در این باره با قابلیت های بسیار زیاد نوشتن!
میتونید از این پکیج استفاده کنید

لینک گفتگو :

https://roocket.ir/discuss/6117


عبداله زرین
تخصص : Laravel VS Vue js
@mr.zarrin1994 4 سال پیش مطرح شد
1

@navids
میتونید از یک table میانی با عنوان category_product هم استفاده کنید که هر محصول بتونه مربوط به چن تا دسته بندی باشه که هر کدوم از دسته بندی ها انتخاب شد بتونیم به محصول دسترسی داشته باشیم


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

درود

بسیار ساده است .دسته بندی ماوس در واقع یکی از descendant های دسته بندی لوازم الکترونیکی میشه. با اسکوپ descendantsOf در مدل Category از پکیج Laravel Categorizable میتونید دسته بندی های تو در تو رو پیدا و محصولات مرتبط با اون ها رو لود و یا eagerload کنید.

توضیحات کامل در گفتگوی زیر
https://roocket.ir/discuss/6117


نوید
تخصص : برنامه نویس Go / Django
@navids 4 سال پیش مطرح شد
0

ممنون از @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;
});

کد بالا دسته بندی ها و زیرمجموعه ها رو نشون میده


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام