Tot ce trebuie sa stiti despre stabilirea si interogarea relatiilor

Definirea relatiilor in Laravel este ceva ce fiecare dezvoltator Laravel a facut probabil de mai multe ori. Dar exista o multime de probleme pe care le puteti intalni atunci cand incercati sa implementati o relatie. Deoarece exista diferite tipuri de relatii, de unde stii pe care sa o alegi? Si cum poti folosi intregul potential al relatiilor atunci cand vine vorba de interogarea modelelor?

Relatiile Laravel pot fi cam greu de infasurat. Daca nu intelegeti pe deplin cum functioneaza relatiile din Laravel in acest moment, nu va faceti griji. Dupa ce ati citit acest articol, ar trebui sa il cunoasteti mai bine.

Array

Pentru a raspunde la aceasta intrebare, trebuie mai intai sa stiti care sunt optiunile disponibile. Exista trei tipuri diferite de relatii:

  • Unu la unu
  • Unul la multi
  • Multi la multi

Vom analiza diferitele tipuri de relatii unul cate unul si vom explica cand sa le folosim.

Unu la unu

Relatia de la unu la unu este cea mai de baza relatie care exista. Acest tip de relatie inseamna ca un model de tip A poate fi legat doar de un singur model de tip B si invers.

Array

De exemplu, o relatie intre un model de utilizator si un model de pasaport ar fi o relatie unu la unu. Un utilizator poate avea un singur pasaport, iar un pasaport apartine unui singur utilizator.

Sa aruncam o privire la modul in care am defini aceasta relatie in cod.

In modelul User cream o metoda numita pasaport. Ii spunem lui Laravel ca modelul de utilizator are un pasaport folosind metoda hasOne.

Array

Nota:

Toate metodele utilizate pentru a defini relatiile au argumente suplimentare optionale. Aceste argumente pot fi folosite pentru a defini cheia locala si straina. In mod implicit, Laravel va presupune ca aveti un passport_id definit in modelul User, deoarece incercati sa creati o relatie cu modelul Passport. Retineti acest lucru atunci cand creati fisiere de migrare!

In modelul Pasaport definim inversul relatiei.

Am anuntat modelul Passport ca apartine unui utilizator . Facem acest lucru folosind metoda belongTo.

Unul la multi

Urmatoarea relatie pe care o puteti defini in Laravel este o relatie cu mai multi. Acest tip de relatie inseamna ca un model de tip A poate fi legat de mai multe modele de tip B. Dar modelul de tip B apartine unui singur model de tip A.

De exemplu, o relatie intre un model de utilizator si un model de factura ar fi o relatie cu mai multi. Un utilizator poate avea mai multe facturi, dar o factura apartine doar unui singur utilizator.

In cod, acest lucru ar arata astfel:

Arata la fel ca codul pe care l-am vazut mai devreme pentru a defini relatia unu la unu, nu?

Tot ce trebuie sa facem acum este sa anuntam modelul Factura ca apartine unui model Utilizator . Sa definim inversul relatiei dintre cei mai multi.

Multi la multi

Ultima relatie este relatia dintre multi si multi. Acest tip de relatie inseamna ca un model de tip A poate fi legat de mai multe modele de tip B si invers.

De exemplu, o relatie intre un model de factura si un model de produs ar fi o relatie de la multi la multi. O factura poate avea mai multe produse, iar un produs poate fi pe mai multe facturi.

Si puteti defini inversul acestei relatii astfel:

Multe pana la multe relatii sunt usor mai dificil de implementat, deoarece necesita o tabela de jonctiune in baza de date. Puteti crea aceasta tabela de jonctiune in Laravel prin crearea unui fisier de migrare.

Are un singur

Relatia „are unul prin” leaga modelele printr-o singura relatie intermediara. Imaginati-va situatia in care fiecare produs are un furnizor si fiecare produs are o inregistrare istorica a produsului. Apoi, modelul furnizorului poate accesa inregistrarea istoricului produsului prin produs.

Asa arata tabelele bazei de date:

furnizori:

– idproducts:

– id

– supplier_idproduct_history:

– id

– product_id

Chiar daca tabelul product_history nu contine o coloana provider_id, furnizorul poate obtine acces la inregistrarea product_history utilizand o relatie „are one through”.

Primul argument care este trecut la metoda hasOneThrough este numele modelului final. Al doilea argument este numele modelului intermediar.

Are multe prin

Relatia „are multe prin” este echivalentul relatiei „are one through”, dar pentru inregistrari multiple. Sa folosim exemplul anterior, dar schimbam un lucru: un produs poate avea acum mai multe intrari de istoric in loc de unul. Tabelele bazei de date raman aceleasi.

In acest fel, modelul furnizorului poate obtine acces la intrarile istorice ale produsului.

Interogarea unei relatii este destul de usoara. Deoarece am definit relatia unu la unu pentru pasaport si relatia unu la multi pentru factura, le putem folosi pe modelul de utilizator. In fiecare caz al modelului de utilizator putem obtine acum pasaportul si facturile aferente.

De asemenea, este posibil sa interogati inversul relatiei. Daca aveti o factura, puteti obtine utilizatorul acelei facturi.

Interogarea unei relatii mai multe pana la multe functioneaza exact in acelasi mod ca si celelalte relatii. In plus, relatia dintre multi si multi are un atribut pivot. Acest atribut reprezinta tabelul de jonctiune si poate fi folosit ca orice alt model.

De exemplu, sa spunem ca tabela de jonctiuni are o coloana created_at. Putem obtine proprietatea created_at folosind pivotul.

Interogarea „are unul prin” si „are multe prin” functioneaza exact in acelasi mod ca si celelalte relatii.

Adaugarea de constrangeri

Este posibil sa adaugati constrangeri unei relatii in timpul interogarii. Aruncati o privire la urmatorul exemplu:

Verificati daca exista o relatie

Uneori doriti sa verificati daca exista o anumita relatie intre modele. Laravel are cateva metode foarte utile pentru a verifica acest lucru: