ساخت دسته بندی بی نهایت در فریم ورک لاراول

fsdfdsf

زمان مطالعه

5 دقیقه

تعداد بازدید

1000

تعداد پرسش ها

2

افزودن به لیست علاقه مندی ها


برچسب ها :


اشتراک گذاری این مطلب
بهزاد میرزازاده
در مورد مدرس : همیشه سخت تلاش کردم و به موفقیت های خیلی زیادی رسیدم اما دلیل نشد که متوقف بشم من برای هر روز برنامه دارم و به امید موفقیت های بزرگتر قدم بر میدارم همیشه سخت ترین مسئله ها، ساده ترین راه حل رو دارند پس بهانه جویی نباید روش کار ما برنامه نویسان باشه!!! ما می توانیم آینده را تعیین کنیم

ساخت دسته بندی بی نهایت در فریم ورک لاراول

fsdfdsf

زمان مطالعه

10 دقیقه

تعداد بازدید

1000

تعداد پرسش ها

2

افزودن به لیست علاقه مندی ها


برچسب ها :


اشتراک گذاری این مطلب

دسته بندی بی نهایت در لاراول

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

مراحل ایجاد گروهبندی با زیر شاخه های نامحدود در لاراول

اول ساخت migration همراه با model و معرفی فیلدهای جدول دسته بندی و سپس نمایش این دسته بندی در قالب یک selectbox مراحل ایجاد دسته یا گروهبندی با زیر شاخه های نامحدود در لاراول خواهد بود.

ایجاد مدل و مایگریشن دسته بندی نامحدود

با دستور ذیل یک مدل با عنوان Category همراه با مایگریشن ایجاد می کنیم.

php artisan make:model Category -m

فیلدهای مایگریشن category فیلد هایی مورد نیاز خود را اضافه می کنیم که در آخر مایگریشنی با فیلدهای ذیل خواهیم داشت فیلدهای این مایگریشن به دلخواه خود شما خواهد بود اما فیلدی با عنوان parent مورد نیاز می باشد تا پدر و فرزندی در دسته بندی بینهایت را تعیین کنیم این فیلد با عدد صفر پدر خواهد بود و در صورت داشتن عدد مثبت فرزند خواهد بود و این رویه برای شاخه های دیگر نیز ادامه دار خواهد بود.

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('parent')->default(0);
            $table->string('title');
            $table->text('text')->nullable();
            $table->string('icon')->nullable();
            $table->string('keywords')->nullable();
            $table->string('description')->nullable();
            $table->smallInteger('sort')->default(1);
            $table->tinyInteger('status')->default(0);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

پس از تعیین فیلد ها با دستور ذیل مایگریشن خود را در دیتابیس ثبت می کنیم تا جدول category در دیتابیس ساخته شود.

php artisan migrate

سپس فیلدهای این مدل را به صورت fillable در مدل category اضافه می کنیم و مدل category به صورت ذیل خواهد بود

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $fillable=['parent','title','text','icon','keywords','description','sort','status'];

}

سپس یک متد جدید داخل این مدل با عنوان sub_category تعریف می کنیم که با استفاده از ORM لاراول تمام فرزندان یک دسته را در سطح مورد نظر برگشت خواهد داد.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $fillable=['parent','title','text','icon','keywords','description','sort','status'];



    public function sub_category()
    {
        return $this->hasMany(self::class,'parent','id');
    }
}

تقریبا مدل ما به صورت کامل آماده شده است سپس به دلخواه دیتابیس خود را با روش seed یا به صورت دستی پر کنید و چندین شاخ و برگ در دسته بندی ایجاد کنید.

 

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

برای نمایش این دسته بندی به صورت نامحدود و همراه با فرزندان یک دسته بندی یم selectbox ساده ایجاد می کنیم که در هر قسمت با افزایش زیردسته و فرزند یک علامت - در option مورد نظر اضافه می کنیم (متغیر i برای این منظور اضافه شده است) تا یک دمو از این نوع خروجی به صورت ساده داشته باشید. برای نمایش دسته بندی ها اول دسته هایی که پدر هستند با parent صفر را انتخاب می کنیم و با افزودن with به این کوئری فرزندان آن را نیز فراخوانی می کنیم که شما می توانید به صورت جدا نیز فراخوانی کنید و اجباری در آن نیست. و هر بار در صورت داشتن فرزند یک view دیگر فراخوانی می شود تا فرزندان آن به option های ما در این selectbox اضافه شود.

<div class="col-md-6 form-group">
	<label for="parent" class="col-md-3 col-form-label">
		<i class="fa fa-star text-danger"></i>
		گروه</label>
	<div class="col-md-9">
		<select name="parent" id="parent">
			<option value="">انتخاب</option>
			@foreach(\App\Category::where('parent',0)->with('sub_category')->get() as $value)
				<option value="{{ $value->id }}">{{ $value->title }}</option>
				@if($value->sub_category->count())
					@php $i=2; @endphp
					@include('cat',['child' => $value->sub_category ,'i' => $i])
				@endif
			@endforeach
		</select>
	</div>
</div>

خب ما برای نمایش فرزندان هر بار یک view با عنوان cat را فراخوانی کرده ایم در داخل این view نیز با داشتن زیرشاخه دوباره این view فراخوانی می شود تا به صورت بازگشتی تمام زیرشاخه های دسته مورد نظر به selectbox اضافه شود

@foreach($child as $item)
	<option value="{{ $item->id }}"> @for($a=0;$a<$i;$a++) - @endfor {{ $item->title }}</option>
    @if($item->child->count())
        @php $i++; @endphp
        @include('cat',['child' => $item->child ,'i' => $i])
    @endif
@endforeach

 

بهزاد میرزازاده
در مورد مدرس : همیشه سخت تلاش کردم و به موفقیت های خیلی زیادی رسیدم اما دلیل نشد که متوقف بشم من برای هر روز برنامه دارم و به امید موفقیت های بزرگتر قدم بر میدارم همیشه سخت ترین مسئله ها، ساده ترین راه حل رو دارند پس بهانه جویی نباید روش کار ما برنامه نویسان باشه!!! ما می توانیم آینده را تعیین کنیم


نظرات
2
کاربر محمد رضا مرادیان
4 روز پیش

سلام یه سوال دارم... ممنون میشم جواب بدین.فیلد پرنت مگه نباید با ای اصلی کلید خارجی باشه؟؟؟ ممنون میشم جواب بدین.

کاربر بهزاد
2 روز پیش

سلام خدمت شما آقای مرادیان ببینید یه دسته بندی میتونه پدر داشته باشه یا نداشته باشه و همچنین فرزند داشته باشه یا نداشته باشه چون بی نهایت در نظر گرفته میشه اگه کلید خارجی باشه فیلد parent اونوقت با حذف یک دسته بندی تمام دسته بندی های دیگه احتمال حذفشون زیاده ! همچنین این روش به صورت بازگشتی با خود همین مدل هستش و چند فانکشن کمکی برای مدیریت این نوع دسته بندی میتونید درست کنید مثلا فانکشنی برای یافتن شناسه کلیه فرزندان دسته انتخاب شده فعلی موفق باشید