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

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

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

زمان مطالعه: 3 دقیقه
بازدید: 1116
پرسش و پاسخ: 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
بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

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