smart
6 سال پیش توسط smart مطرح شد
7 پاسخ

ساختار دیتابیس در طراحی دسته بندی همراه با زیردسته بندی

سلام. من میخوام تو وبسایت دسته بندی داشته باشم که هر دسته بندی چندتا زیر دسته بندی داره و هر زیردسته بندی هم خودش میتونه چندتا زیردسته بندی دیگه داشته باشه. این زیردسته بندی هم باید دینامیک باشه یعنی تا چند مرحله نامشخص باشه. توی دیتابیس چطور تعریف میشه ؟ یه جدول که هر دسته بندی یه parent_id داشته باشه ؟ یا روش دیگه ای هست ؟

مورد بعد اینکه من میخوام واسه یه محصول تعریف کنم که مربوط به یه زیردسته بندی هست. ولی میخوام وقتی محصولات مربوط به دسته بندی پدر اون زیردسته بندی رو زدم واسه مشاهده، اون محصول مربوط به زیردسته بندی هم نمایش داده بشه.

مثلا فرض کنید دسته بندی کتاب درسی داریم
زیردسته های مدرسه، دانشگاه و ... هم داریم
و واسه دانشگاه مثلا زیردسته های عمومی و تخصصی داریم
و همینطور میتونه این زیردسته بندی ادامه پیدا کنه.
حالا من اگر یه کتاب واسه زیردسته عمومی تعریف کردم میخوام اگر زدم لیست کتب دانشگاهی یا مثلا لیست کتب درسی، این کتاب رو هم نشون بده.

معماری و روش انجام این کار چیه ؟ یه PIVOT TABLEواسه محصولات و دسته بندی ها تعریف کنم که وقتی میخوام محصول رو ثبت کنم بیاد اون محصول رو واسه اون زیردسته بندی و تمام دسته بندی های پدر ثبت کنه ؟ مثلا 3-4 تا رکورد ثبت بشه توی جدول؟ یا روش دیگه ای هست؟

@hesammousavi
@ali.bayat


ثبت پرسش جدید
bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
0

داخل مدل به صورت زیر باشئ

    public function parent()
    {
        return $this->belongsTo(Menu::class, 'parent_id');

    }

    public function children()
    {
        return $this->hasMany(Menu::class, 'parent_id');
    }

mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 6 سال پیش مطرح شد
0

سلام میتونید فیلد های زیر رو داشته باشید

id
name
parent_id
published_at
created_at
updated_at

فیلد parent_id به دسته بندی والد خودش اشاره میکنه و میتونید حالت های تودرتو داشته باشید. پیاده سازیش خیلی راحته.


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
0

داخل مدل به صورت زیر باشئ

    public function parent()
    {
        return $this->belongsTo(Menu::class, 'parent_id');

    }

    public function children()
    {
        return $this->hasMany(Menu::class, 'parent_id');
    }

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

سلام
@smartgarden2016

این مطلب رو بخونید
https://roocket.ir/discuss/1856
کمکتون خواهد کرد!


smart
@smartgarden2016 6 سال پیش آپدیت شد
0

ممنون دوستان. من مشکل اصلیم مربوط به حالتی بود که تا چندین مرحله زیردسته وجود داشته باشه. تا یه مرحله رو مشکلی نداشتم. که البته با eager loading و پاسخ دومی که دوستان دادن تونستم تا حدی مشکل رو حل کنم.


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد
0

اینم به صورت کامل
به صورت بهینه میشه چیزی به صورت زیر
مدل

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   protected $fillable = ['name'];

   public function parent()
   {
       return $this->belongsTo(Category::class, 'parent_id');
   }

   public function children()
   {
       return $this->hasMany(Category::class, 'parent_id');
   }
}

کنترلر

   public function index()
   {
       $categories = Category::with('children')->whereNull('parent_id')->get();
       return view('categories.index', compact('categories'));
   }

view

@each('partials._category', $categories, 'category', 'partials._empty-categories')

sub-view

<li>{{ $category->name }}</li>
@if ($category->children->count() > 0)
   <ul>
       @foreach($category->children as $child)
           @include('partials._category', ['category' => $child])
       @endforeach
   </ul>
@endif 

smart
@smartgarden2016 6 سال پیش مطرح شد
1

عالی بود @Arshavir
ممنون


bardia
تخصص : Golang/Laravel
@mrbardia72 6 سال پیش مطرح شد

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

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