Trucuri pentru relațiile elocvente Laravel

Unul dintre punctele forte ale lui Laravel este sintaxa sa elegantă. Dacă aveți o mulțime de modele și relații în Laravel (datorită multor tabele din baza de date), traversarea se poate termina adesea cu un cod mai puțin elegant. De-a lungul timpului, trei mici extensii s-au dovedit pentru mine, pe care aș dori să le prezint pe scurt mai jos. Folosim doar câteva moșteniri, metode magice și colecții personalizate.


Mai întâi creăm un nou model sub app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Apoi lăsăm toate modelele să moștenească de la noul nostru model Convenience:

b45e29b9125c2ab565b5526442437686

Amestecă-ți propriile funcții cu relațiile

Dacă doriți să obțineți modele conectate, utilizați sintaxa standard pentru a le apela:

b45e29b9125c2ab565b5526442437686

Dacă acum adăugați propria logică de afaceri, doriți să utilizați notația (inferioară) a cămilei:

b45e29b9125c2ab565b5526442437686

Vrem să standardizăm sintaxa ambelor variante. Pentru a face acest lucru, adăugăm metoda magică __call la ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Prin urmare, acest apel este posibil și în exemplul de mai sus:

b45e29b9125c2ab565b5526442437686

Verificați obiectele goale

Dacă doriți să trimiteți numele țării la o adresă personală, veți vedea adesea următorul cod:

b45e29b9125c2ab565b5526442437686

Pentru a preveni acest lucru, includem biblioteca stringhelper și returnăm un obiect special din clasa goală gol dacă nu se găsește un model:

b45e29b9125c2ab565b5526442437686

Acest lucru face ca apelul să aibă succes (în acest exemplu, dacă se găsește ceva, se afișează numele țării, în toate celelalte cazuri un șir gol).

b45e29b9125c2ab565b5526442437686

Dacă dorim, de asemenea, să acoperim cazul în care utilizatorul cu ID-ul 42 poate să nu existe, vom construi și o mică funcție de ajutor:

b45e29b9125c2ab565b5526442437686

Următorul apel oferă astfel un șir gol chiar dacă utilizatorul nu există deloc:

b45e29b9125c2ab565b5526442437686

Transferați convenabil relațiile n: m

În cele din urmă, dorim să simplificăm următorul cod:

b45e29b9125c2ab565b5526442437686

Pentru aceasta folosim posibilitatea colecțiilor personalizate . Extindem mai întâi modelul de comoditate:

b45e29b9125c2ab565b5526442437686

Apoi creăm fișierul app \ Helpers \ ConvenienceCollection.php , care asigură că apelarea funcțiilor necunoscute din colecții execută funcția pentru toate articolele din colecție:

b45e29b9125c2ab565b5526442437686

Deci, putem folosi următorul cod pentru a afișa toate numele tuturor țărilor din toate adresele tuturor părinților persoanei respective:

b45e29b9125c2ab565b5526442437686

Dar sunt posibile și apeluri precum următoarele:

b45e29b9125c2ab565b5526442437686

Sortați după mai multe coloane

Următorul apel sortează numai în funcție de locație , deși probabil că nu doreai:

b45e29b9125c2ab565b5526442437686

Pentru a permite sortarea în funcție de mai multe coloane, extindem ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Cu aceasta putem sorta colecția în funcție de mai multe coloane cu:

b45e29b9125c2ab565b5526442437686

Sortare standard

Extindem ConvenienceCollection cu o altă funcție auxiliară:

b45e29b9125c2ab565b5526442437686

Acum puteți oferi fiecărui model o funcție de sortare standard individuală:

b45e29b9125c2ab565b5526442437686

Deci putem sorta o colecție cu:

b45e29b9125c2ab565b5526442437686

Numele obiectelor

Fiecare model implementează metoda getLabel (getName variază în funcție de model):

b45e29b9125c2ab565b5526442437686

Cu aceasta puteți afișa rapid și ușor numele unui obiect. Apoi, puteți implementa metoda de ajutor sortByLabel în ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Rezultate goale

Dacă un pas intermediar este gol, funcțiile Laravel first () și last () returnează de obicei zero. Prin urmare, introducem getFirst () și getLast () astfel încât următorul apel să aibă întotdeauna succes:

b45e29b9125c2ab565b5526442437686

Cu aceasta, livrăm înapoi un ajutor __empty_ pe care __x îl recunoaște:

b45e29b9125c2ab565b5526442437686

Înapoi