Maison > cadre php > Laravel > 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
Libérer: 2020-05-11 13:59:48
avant
2995 Les gens l'ont consulté

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();
});
Copier après la connexion

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);
    }
}
Copier après la connexion

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');
}
Copier après la connexion

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');
Copier après la connexion

app/Http/CategoryController.php comme suit :

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

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>
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal