Maison  >  Article  >  cadre php  >  Utilisation de hasMany de Laravel Eloquent pour développer la classification Infinitus

Utilisation de hasMany de Laravel Eloquent pour développer la classification Infinitus

Guanhui
Guanhuiavant
2020-05-11 10:20:442933parcourir

La colonne tutorielle d'introduction suivante développée par Laravel vous présentera la méthode d'utilisation de hasMany de Laravel Eloquent pour développer la classification Infinitus. J'espère qu'elle sera utile aux amis dans le besoin ! Dans les centres commerciaux en ligne, nous pouvons souvent voir des catégories, des sous-catégories et même des catégories Infinitus à plusieurs niveaux. Cet article vous montrera comment l'implémenter avec élégance avec Laravel Eloquent.

Nous allons créer un micro projet pour afficher la classification des magasins pour enfants, avec un total de 5 niveaux, comme suit :

Utilisation de hasMany de Laravel Eloquent pour développer la classification Infinitus

Migration de la base de données

Structure de table de données simple :

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();
});

n'a qu'un seul champ de nom, lié à lui-même. Par conséquent, la plupart des catégories parentescategory_id = NULL, et chaque sous-catégorie a un parent_id

Les données du tableau de données sont les suivantes :

Utilisation de hasMany de Laravel Eloquent pour développer la classification Infinitus

Modèle éloquent et relations associées

Tout d'abord, créez une méthode simple hasMany() dans app/Category.php Les catégories peuvent avoir leurs propres auto-catégories :

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

La meilleure chose à propos de cet article est. le début du "plan" du spectacle. Saviez-vous que vous pouvez décrire une relation récursive comme celle-ci ? Comme suit :

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

Donc, si vous appelez Category::with('categories'), vous obtiendrez les "sous-catégories" de niveau inférieur, mais Category::with('childrenCategories') vous aidera à atteindre infini.

Routes et méthodes de contrôleur

Essayons maintenant d'afficher toutes les catégories et sous-catégories comme indiqué dans l'exemple ci-dessus.

Dans routes/web.php, nous ajoutons ce qui suit :

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

app/Http/CategoryController.php comme suit :

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

Nous chargeons uniquement la catégorie parent, qui les sous-catégories serviront de relations. Simple, non ?

Vues et sous-vues récursives

Enfin, effectuez le rendu sur la page. Dans le fichier resources/views/categories.blade.php :

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

nous parcourons d'abord la catégorie parent de niveau supérieur, puis parcourons les sous-catégories de la catégorie parent, puis utilisons @include pour charger les sous-catégories de la sous-catégorie.. ....

La meilleure partie est que resources/views/admin/child_category.blade.php se chargera de manière récursive. Regardez le code :

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

Dans child_category.blade.php, nous incluons @include('child_category') afin que le modèle charge récursivement les sous-catégories tant qu'il y a des catégories dans la sous-catégorie actuelle.

Ça y est ! Nous avons des niveaux illimités de sous-catégories - que ce soit dans les bases de données, les relations ou les vues

Pour plus d'articles techniques sur le framework Laravel, veuillez visiter les didacticiels

laravel !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer