با سلام خدمت دوستان
من دارم یک فروشگاه طراحی میکنم که یک مدل دسته بندی داره ( category ) و یک مدل product و مدل های دیگه مثل مقالات و دوره ها
من بجای اینکه برای مقاله ها - دوره ها - محصولات جداگانه بیام برای هر کدام یک جدول دسته بندی طراحی کنم از یکی برای همه استفاده کردم.
یعنی از جدول واسط استفاده کردم برای اینکار. جداول من
category
product
article
course
category_product
article_category
category_course
حالا سوال من اینجاست که :
من میخوام هم کار به ساخت جداول جدا نشه (1)
هم یک دسته بندی بتونه به تعداد نا معلوم زیر بخش ( فرزند ) داشته باشه (2)
و مشکلایی که بهش خوردم اینهاست :
وقتی تو خود جدول محصولات میام یک فیلد به عنوان category_id اضافه میکنم دیگه نمیشه به یک محصول چند تا دسته بندی اضافه کرد
برای همین رفتم سراغ جدول واسط
اومدم ازmorphy استفاده کردم که یک دسته بندی فرزند داشته باشه اما نتونستم تکمیلش کنم و درکش نکردم
الان که از جدول واسط استفاده میکنم مشکلم اینه نمیدونم چجوری وقعی که منو دسته بندی هامو میخوم نشون بدم با چه پرسمانی و روشی یک ارایه برگردونم که توش ارایه تو در تویی از دسته بندی ها به همراه زیر بخش هاش باشه چون نمیتونم تابع بازشگتی استفاده کنم تو لایه نمایش
مشکل بعدی اینه که وقتی میخوام محصولات مشابه و نشون بدم ممکنه یک محصول چند تا دسته بندی دشته باشه
میخوام کدی بنویسم که بتونه اول لیست همه دسته بندی های محصول و در بیاره و بعد محصولاتی که تو اون دسته بندی ها هست و با توجه به اینکه چقدر فروش داشتند یا بازدید خوردند یا دلایل دیگه برگردونه
نمیدونم این میتونه کمکتون کنه یا نه
https://roocket.ir/discuss/6117
https://github.com/AliBayat/Laravel-Categorizable
سلام
رابطه پولی مورفیک زیر بهتون کمک میکنه:
class Category extends Model
{
public function parent()
{
return $this->belongsTo(static::class, 'parent_id','id');
}
public function children()
{
return $this->hasMany(static::class, 'parent_id','id');
}
public function articles()
{
return $this->morphedByMany('App\Article', 'categorible');
}
public function products()
{
return $this->morphedByMany('App\Product', 'categorible');
}
}
class Article extends Model
{
/**
* دریافت تمامی دسته های مقاله.
*/
public function categories()
{
return $this->morphToMany('App\Category', 'categorible');
}
}
class Product extends Model
{
/**
* دریافت تمامی دسته های محصول.
*/
public function categories()
{
return $this->morphToMany('App\Category', 'categorible');
}
}
توجه کنید که باید فیلد های زیر رو در دیتابیس مدل Category ایجاد کنید.
categoris
id - integer
title - string
parent_id - integer
categorible_id - integer
categorible_type - string
به عنوان مثال برای نمایش دسته بندی های یک محصول میتوان از کد زیر استفاده کرد:
echo '<ul>';
foreach($product->categories() as $cat){
echo '<li>';
echo $cat->title; //name of category
echo '</li>';
}
echo '</ul>';
در نهایت برای نمایش تمامی دسته ها یک فایل blade ایجاد کرده:
# category-items.blade.php
@foreach($categories as $c)
</li>
<a href="{{route('categories.show',[$c])}}">{{$c->title}}</a>
<ul>
@if(count($c->children))
@include('category-items',['categories' => $c->children])
@endif
</ul>
<li>
@endforeach
حالا این فایل را در ویویی که میخواهیم لیست در آن نمایش داده شود فراخوانی میکنیم:
# index.blade.php
# ...
<ul>
@include('category-items',['categories' => \Category::all()])
</ul>
# ...
بنده اخیرا پکیجی به نام Laravel Categorizable منتشر کردم. این پکیج کاملا با نسخه ۶ و ۷ لاراول سازگار است و با بهره گیری از روابط چندریختی (Polymorphism) این امکان را به ما میدهد که: هر مدلی که خواستیم را دسته بندی کنیم. به عبارت دیگر در یک اپلیکیشن لاراولی میتوانیم پستها، محصولات، ویدیوها و هر تعداد مدل دیگر که نیاز داریم را براحتی دسته بندی کنیم;
با این پکیج همچنین ساخت، به روزرسانی و حذف دسته بندیهای ساده و تودرتو به راحتی قابل انجام است.
تنها کافیست از تریت پکیح در مدل مورد نظر استفاده کنیم:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use AliBayat\LaravelCategorizable\Categorizable;
class Post extends Model
{
use Categorizable;
}
مراحل کامل نصب و استفاده در گفتگوی زیر و ریپوی گیت موجوده:
https://roocket.ir/discuss/6117
https://github.com/AliBayat/Laravel-Categorizable
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟