راکت

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

4 پاسخ

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

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

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

ثبت پرسش جدید

پاسخ‌ها

4
Alimotreb
Alimotreb
@Alimotreb

تخصص: کانفیگ سرور و برنامه نویس

سلام
@navids

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

لینک گفتگو :

https://roocket.ir/discuss/6117

عبداله زرین
عبداله زرین
@mr.zarrin1994

تخصص: Laravel VS Vue js

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

شاید پاسخ شما همین‌جا باشد

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

درود

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

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

نوید
نوید
@navids

تخصص: برنامه نویس Go / Django

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

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

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

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