اغلب در فروشگاه های الکترونیکی می توانید سطح بسیاری از دسته ها و زیر مجموعه ها را مشاهده کنید ، حتی گاهی اوقات نامحدود. این مقاله به شما نشان می دهد که چگونه با Laravel Eloquent به زیبایی به آن دست پیدا کنید.

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


مهاجرت پایگاه داده

در اینجا یک نمودار ساده از جدول DB آورده شده است:

Schema::create('categories', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->unsignedBigInteger('category_id')->nullable();
    $table->foreign('category_id')->references('id')->on('categories');
    $table->timestamps();
});

ما فقط یک نام زمینه ، و سپس رابطه با جدول خود. بنابراین بیشتر گروه والدین خواهند داشت category_id = NULL، و هر زیر مجموعه دیگری والد_خود را دارد.

در اینجا داده های ما در پایگاه داده وجود دارد:


الگوی فصیح و روابط

اول ، در برنامه / Category.php ما یک ساده اضافه می کنیم hasMany () روش ، بنابراین دسته ممکن است زیر مجموعه های دیگری داشته باشد:

class Category extends Model
{

    public function categories()
    {
        return $this->hasMany(Category::class);
    }

}

حالا می آید بزرگترین “ترفند” مقاله. آیا می دانید می توانید توصیف کنید بازگشتی ارتباط؟ مثل این:

public function childrenCategories()
{
    return $this->hasMany(Category::class)->with('categories');
}

بنابراین ، اگر شما تماس بگیرید دسته بندی :: با (“دسته ها”)، این یک سطح از “کودکان” را برای شما به ارمغان می آورد ، اما دسته بندی :: با (“دسته بندی های کودکان”) به شما به عنوان بسیاری از سطح آن را پیدا کنید.


روش Route و Controller

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

که در مسیرها / web.php، ما این را اضافه می کنیم:

Route::get('categories', 'CategoryController@index');

سپس، app / Http / CategoryController.php به نظر می رسد مانند این:

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

همانطور که می بینید ، ما فقط دسته های والدین را بارگیری می کنیم که فرزندان به عنوان رابطه هستند. ساده ، ها؟


مشاهده و بازگشت فرعی بازگشت

سرانجام ، به ساختار Views. اینجا مال ماست منابع / نمایش ها / categories.blade.php:

<ul>
    @foreach ($categories as $category)
        <li>{{ $category->name }}</li>
        <ul>
        @foreach ($category->childrenCategories as $childCategory)
            @include('child_category', ['child_category' => $childCategory])
        @endforeach
        </ul>
    @endforeach
</ul>

همانطور که مشاهده می کنید ، ما دسته های اصلی را بارگیری می کنیم و سپس دسته های کودکان را با آنها بارگیری می کنیم @عبارتند از.

بهترین قسمت این است که منابع / views / admin / child_category.blade.php استفاده خواهد کرد بازگشتی بارگیری از خود. کد را ببینید:

<li>{{ $child_category->name }}</li>
@if ($child_category->categories)
    <ul>
        @foreach ($child_category->categories as $childCategory)
            @include('child_category', ['child_category' => $childCategory])
        @endforeach
    </ul>
@endif

همانطور که می بینید ، در داخل child_category.blade.php ما داریم include (“دسته_بندی”)، بنابراین این الگو بطور بازگشتی کودکان را بارگیری می کند ، به شرط آنکه دسته هایی در گروه کودک فعلی وجود داشته باشد.


و همین! ما سطح زیر مجموعه های نامحدودی داریم – در پایگاه داده ، در روابط فصیح و در Views.