laravel implémente une classification infinie

大家讲道理
Libérer: 2023-03-05 22:24:02
original
4200 Les gens l'ont consulté

Explication

Tout le monde utilise généralement la récursivité pour implémenter la classification infinie. Nous savons tous que la récursion est très inefficace. Voici un package d'extension Laravel recommandé. etrepat/baum, faites en sorte que votre modèle de données prenne rapidement en charge une structure hiérarchique arborescente infinie, tout en tenant compte de l'efficacité.

Utilisez le modèle d'ensemble imbriqué Baum pour implémenter la classification infinie du modèle Laravel

La documentation officielle du package d'extension a un espace pour l'explication, et l'image ci-dessous est aussi un Exemple simple :

laravel implémente une classification infinie

Description du cas d'utilisation #

Parlons ensuite de quelques exemples de modèles hiérarchiques d'arbres infinis.

Système de balises#

Référence : Laravel Taggable Ajoutez une fonction de balisage à votre modèle. Une balise peut avoir d'innombrables balises enfants, appartenir à une balise parent et avoir plusieurs balises homologues.

Par exemple, l'arborescence des balises ci-dessous :

$tagTree = [
    'name' => 'RootTag',
    'children' => [
        ['name' => 'L1Child1',
            'children' => [
                ['name' => 'L2Child1'],
                ['name' => 'L2Child1'],
                ['name' => 'L2Child1'],
            ]
        ],
        ['name' => 'L1Child2'],
        ['name' => 'L1Child3'],
    ]];
Copier après la connexion

Système de commentaires #

Commentaires imbriqués à l'infini, comme le système de commentaires de NetEase.

laravel implémente une classification infinie

Laravel a une extension de commentaire qui prend en charge l'imbrication infinie, voir Slynova-Org/laravel-commentable.

Modèle de données "Barre de navigation"#

L'arrière-plan de l'administrateur doit fournir une fonction de personnalisation de la "barre de navigation" et une barre de navigation arborescente.

laravel implémente une classification infinie

Baum#

etrepat/baum intégré permet rapidement à votre modèle de données de prendre en charge la structure hiérarchique arborescente Infinitus tout en prenant en compte l'efficacité.

Ensuite, nous parlerons de la façon d'intégrer.

1. Installation de Composer#

composer require "baum/baum:~1.1"
Copier après la connexion

2. Ajouter un fournisseur#

Modifiez le fichier config/app.php et ajoutez : providers<🎜 dans le

array>
&#39;Baum\Providers\BaumServiceProvider&#39;,
Copier après la connexion
Ce fournisseur de services enregistre deux commandes :

, artisan baum. artisan baum.install

3. Créez la migration#

et installez-la sur le modèle de données existant :

php artisan baum:install MODEL
Copier après la connexion
Exécutez ensuite

php artisan migrate
Copier après la connexion
sur les champs de migration Introduction#

  • parent_id : l'identifiant du nœud parent

  • lft : la valeur de l'index gauche

  • rgt : Valeur d'index à droite

  • profondeur : Niveau de profondeur

Ce qui suit est un exemple :

class Category extends Migration {
  public function up() {
    Schema::create(&#39;categories&#39;, function(Blueprint $table) {
      $table->increments(&#39;id&#39;);

         // 这四行代码
      $table->integer(&#39;parent_id&#39;)->nullable();
      $table->integer(&#39;lft&#39;)->nullable();
      $table->integer(&#39;rgt&#39;)->nullable();
      $table->integer(&#39;depth&#39;)->nullable();

      $table->string(&#39;name&#39;, 255);

      $table->timestamps();
    });
  }}
Copier après la connexion
4. Configurez le modèle de données #

Hériter BaumNode

class Category extends Baum\Node {}
Copier après la connexion
Après l'héritage, ces propriétés peuvent être remplacées :

class Category extends Baum\Node {
  protected $table = &#39;categories&#39;;

  // &#39;parent_id&#39; column name
  protected $parentColumn = &#39;parent_id&#39;;

  // &#39;lft&#39; column name
  protected $leftColumn = &#39;lidx&#39;;

  // &#39;rgt&#39; column name
  protected $rightColumn = &#39;ridx&#39;;

  // &#39;depth&#39; column name
  protected $depthColumn = &#39;nesting&#39;;

  // guard attributes from mass-assignment
  protected $guarded = array(&#39;id&#39;, &#39;parent_id&#39;, &#39;lidx&#39;, &#39;ridx&#39;, &#39;nesting&#39;);}
Copier après la connexion
L'intégration est réussie.

Utiliser

$root = Tag::create([&#39;name&#39; => &#39;Root&#39;]);

// 创建子标签
$child1 = $root->children()->create([&#39;name&#39; => &#39;Child1&#39;]);

$child = Tag::create([&#39;name&#39; => &#39;Child2&#39;]);
$child->makeChildOf($root);

// 批量构建树
$tagTree = [
    &#39;name&#39; => &#39;RootTag&#39;,
    &#39;children&#39; => [
        [&#39;name&#39; => &#39;L1Child1&#39;,
            &#39;children&#39; => [
                [&#39;name&#39; => &#39;L2Child1&#39;],
                [&#39;name&#39; => &#39;L2Child1&#39;],
                [&#39;name&#39; => &#39;L2Child1&#39;],
            ]
        ],
        [&#39;name&#39; => &#39;L1Child2&#39;],
        [&#39;name&#39; => &#39;L1Child3&#39;],
    ]
];

Tag::buildTree($tagTree);
Copier après la connexion


Étiquettes associées:
source:php.cn
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