Home > Article > PHP Framework > Using Laravel Eloquent's hasMany to develop Infinitus classification
The following is developed by LaravelThe introductory tutorial column will introduce you to the method of using Laravel Eloquent's hasMany to develop Infinitus classification. I hope it will be helpful to friends in need!
In online shopping malls, we can often see multi-level classifications, sub-categories, and even Infinitus classifications. This article will show you how to elegantly implement it with Laravel Eloquent.
We will create a micro project to display the classification of children's stores, with a total of 5 levels, as follows:
Database migration
Simple data table structure:
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(); });
There is only one name field, related to itself. Therefore, most parent categories category_id = NULL, and each subcategory has a parent_id
The data table data is as follows:
##Eloquent model And the relationship
First, create a simple hasMany() method in app/Category.php. The category may have its own self-categorization:class Category extends Model { public function categories() { return $this->hasMany(Category::class); } }The show starts with the best part of this article" plan". Did you know that you can describe a recursive relationship like this? As follows:
public function childrenCategories() { return $this->hasMany(Category::class)->with('categories'); }Therefore, if you call Category::with(‘categories’), you will get the lower-level “subcategories”, but Category::with(‘childrenCategories’) will help you achieve infinity.
Routes and Controller Methods
Now, let us try to display all categories and subcategories as shown in the above example. In routes/web.php, we add the following:Route::get('categories', 'CategoryController@index');app/Http/CategoryController.php as shown below:
public function index() { $categories = Category::whereNull('category_id') ->with('childrenCategories') ->get(); return view('categories', compact('categories')); }We only load the parent category and add Subcategories as relationships. Simple right?
Views and recursive subviews
Finally, render to the page. In the resources/views/categories.blade.php file:<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>We first traverse the top-level parent category, then traverse out the subcategories of the parent class, and then use @include to load the subcategories of the subcategory.. ....The best part is that resources/views/admin/child_category.blade.php will load itself recursively. Look at the code:
<li>{{ $child_category->name }}</li> @if ($child_category->categories) <ul> @foreach ($child_category->categories as $childCategory) @include('child_category', ['child_category' => $childCategory]) @endforeach </ul> @endifInside child_category.blade.php, we include @include(‘child_category’), so the template will recursively load subcategories as long as there are categories in the current subcategory. That's it! We have unlimited levels of subcategories - whether in databases or relationships or viewsFor more laravel framework technical articles, please visit
The above is the detailed content of Using Laravel Eloquent's hasMany to develop Infinitus classification. For more information, please follow other related articles on the PHP Chinese website!