Introducere

Aceasta extensie Laravel Eloquent ofera relatii recursive utilizand expresii de tabel comune (CTE).

Suporta Laravel 5.5.29+.

Compatibilitate

  • MySQL 8.0+
  • MariaDB 10.2+
  • PostgreSQL 9.4+
  • SQLite 3.8.3+
  • SQL Server 2008+

Instalare

compozitorul necesita staudenmeir / laravel-adjacency-list: “^ 1.0”

Utilizare

  • Notiuni de baza
  • Relatii incluse
  • Relatii personalizate
  • Copaci
  • Filtre
  • Ordin
  • Adancime
  • cale
  • Cai personalizate

Notiuni de baza

Luati in considerare urmatoarea schema de tabel pentru date ierarhice:

Schema :: create (‘utilizatori’, functie (Blueprint $ table) {$ table-> bigIncrements (‘id’); $ table-> unsignedBigInteger (‘parent_id’) -> nullable ();});

Utilizati caracteristica HasRecursiveRelationships din modelul dvs. pentru a lucra cu relatii recursive:

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; }

In mod implicit, caracteristica asteapta o cheie parinte numita parent_id. Il puteti personaliza suprascriind getParentKeyName ():

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functia publica getParentKeyName () {return ‘parinte_id’; }}

In mod implicit, trasatura foloseste cheia primara a modelului ca cheie locala. Il puteti personaliza suprascriind getLocalKeyName ():

clasa Utilizator extinde Modelul {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functia publica getLocalKeyName () {return ‘id’; }}

Relatii incluse

Trasatura ofera diverse relatii:

$ stramosi = Utilizator :: gasiti ($ id) -> stramosi; $ utilizatori = Utilizator :: cu (‘descendenti’) -> get (); $ utilizatori = Utilizator :: undeHas (‘frati’, functie ($ interogare) {$ interogare-> unde (‘nume’, ‘=’, ‘Ioan’);}) -> get (); $ total = Utilizator :: gasi ($ id) -> descendenti () -> conta (); Utilizator :: gasi ($ id) -> descendenti () -> actualizare ([‘activ’ => fals]); Utilizator :: gasi ($ id) -> frati () -> sterge ();

Relatii personalizate

De asemenea, puteti defini relatii personalizate pentru a prelua recursiv modele conexe.

Luati in considerare o relatie HasMany intre utilizator si postare:

clasa Utilizator extinde Modelul {postari de functii publice () {return $ this-> hasMany (‘App \ Post’); }}

Definiti o relatie HasManyOfDescendants pentru a obtine toate postarile unui utilizator si ale descendentilor acestuia:

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functie publica recursivePosts () {return $ this-> hasManyOfDescendantsAndSelf (‘App \ Post’); }} $ recursivePosts = Utilizator :: gasi ($ id) -> recursivePosts; $ utilizatori = Utilizator :: cuCount (‘recursivePosts’) -> get ();

Utilizati hasManyOfDescendants () pentru a obtine numai postarile descendentilor:

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functie publica descendentPosts () {return $ this-> hasManyOfDescendants (‘App \ Post’); }}

Daca utilizati pachetul in afara Laravel sau ati dezactivat descoperirea pachetului pentru staudenmeir / laravel-cte, trebuie sa adaugati suport pentru expresii de tabel comune la modelul inrudit:

clasa Post extinde Modelul {use \ Staudenmeir \ LaravelCte \ Eloquent \ QueriesExpressions; }

Copaci

Trasatura ofera arborelui () domeniului de interogare pentru a obtine toate modelele, incepand cu radacina (radacinile):

$ tree = User :: tree () -> get ();

treeOf () va permite sa interogati copaci cu constrangeri personalizate pentru modelul (modelele) radacina. Luati in considerare un tabel cu mai multe liste separate:

$ constrangere = functie ($ interogare) {$ interogare-> undeNull (‘parinte_id’) -> unde (‘list_id’, 1); }; $ tree = User :: treeOf ($ constraint) -> get ();

Filtre

Trasatura ofera domenii de interogare pentru a filtra modelele dupa pozitia lor in arbore:

  • hasChildren (): Modele cu copii.
  • hasParent (): Modele cu un parinte.
  • isLeaf (): Modele fara copii.
  • isRoot (): Modele fara parinte.
$ noLeaves = Utilizator :: hasChildren () -> get (); $ noRoots = Utilizator :: hasParent () -> get (); $ frunze = Utilizator :: isLeaf () -> get (); $ radacini = Utilizator :: isRoot () -> get ();

Ordin

Trasatura ofera domenii de interogare pentru a comanda modele latime-intai sau adancime-intai:

  • breadthFirst (): Aduceti fratii inaintea copiilor.
  • depthFirst (): Aduceti copiii inainte de frati.
$ tree = User :: tree () -> breadthFirst () -> get (); $ descendenti = Utilizator :: gasi ($ id) -> descendenti () -> depthFirst () -> get ();

Adancime

Rezultatele interogarilor despre stramosi, descendenti si copaci includ o coloana de adancime suplimentara.

Contine profunzimea modelului in raport cu parintele interogarii. Adancimea este pozitiva pentru descendenti si negativa pentru stramosi:

$ descendantsAndSelf = User :: find ($ id) -> descendantsAndSelf () -> depthFirst () -> get (); echo $ descendentsAndSelf [0] -> profunzime; // 0 echo $ descendentsAndSelf [1] -> profunzime; // 1 echo $ descendentsAndSelf [2] -> profunzime; // 2

Puteti personaliza numele coloanei suprascriind getDepthName ():

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functia publica getDepthName () {returneaza „adancimea”; }}

Constrangeri de adancime

Puteti utiliza domeniul de interogare whereDepth () pentru a filtra modelele dupa adancimea lor relativa:

$ descendenti = Utilizator :: gasi ($ id) -> descendenti () -> undeDepth (2) -> get (); $ descendenti = Utilizator :: gasi ($ id) -> descendenti () -> undeDepth (‘<‘, 3) -> get ();

Interogarile cu constrangeri whereDepth () care limiteaza adancimea maxima construiesc tot intregul (sub) arborescent intern. Ambele domenii de copac va permit sa oferiti o adancime maxima care imbunatateste performanta interogarii, construind doar sectiunea solicitata a arborelui:

$ copac = Utilizator :: copac (3) -> get (); $ tree = Utilizator :: treeOf (constrangere $, 3) -> get ();

cale

Rezultatele interogarilor despre stramosi, descendenti si copaci includ o coloana de cale suplimentara.

Acesta contine calea separata de puncte a cheilor locale de la parintele interogarii la model:

$ descendentsAndSelf = User :: find (1) -> descendantsAndSelf () -> depthFirst () -> get (); echo $ descendentsAndSelf [0] -> cale; // 1 echo $ descendentsAndSelf [1] -> cale; // 1.2 echo $ descendentsAndSelf [2] -> cale; // 1.2.3

Puteti personaliza numele coloanei si separatorul prin modificarea metodelor respective:

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functia publica getPathName () {return ‘cale’; } functie publica getPathSeparator () {return ‘.’; }}

Cai personalizate

Puteti adauga coloane de cale personalizate la rezultatele interogarii:

clasa User extinde Model {use \ Staudenmeir \ LaravelAdjacencyList \ Eloquent \ HasRecursiveRelationships; functia publica getCustomPaths () {return [[‘name’ => ‘slug_path’, ‘column’ => ‘slug’, ‘separator’ => ‘/’,],]; }} $ descendentsAndSelf = User :: find (1) -> descendantsAndSelf; echo $ descendentsAndSelf [0] -> slug_path; // user-1 echo $ descendentsAndSelf [1] -> slug_path; // user-1 / user-2 echo $ descendentsAndSelf [2] -> slug_path; // user-1 / user-2 / user-3

Contribuind

Va rugam sa consultati CONTRIBUTIA si CODUL DE CONDUITA pentru detalii.