Sztuczki dla elokwentnych relacji Laravela

Jedną z mocnych stron Laravel jest jego elegancka składnia. Jeśli masz wiele modeli i relacji w Laravel (ze względu na dużą liczbę tabel w bazie danych), przechodzenie często kończy się mniej eleganckim kodem. Z biegiem czasu sprawdziły się trzy małe rozszerzenia, które chciałbym pokrótce przedstawić poniżej. Po prostu używamy dziedziczenia, magicznych metod i niestandardowych kolekcji.


Najpierw tworzymy nowy model w app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Następnie pozwoliliśmy wszystkim modelom dziedziczyć po naszym nowym ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Połącz swoje własne funkcje z relacjami

Jeśli chcesz uzyskać połączone modele, możesz je wywołać za pomocą standardowej składni:

b45e29b9125c2ab565b5526442437686

Jeśli teraz dodajesz własną logikę biznesową, lubisz używać (niższej) notacji wielbłąda:

b45e29b9125c2ab565b5526442437686

Chcemy ujednolicić składnię obu wariantów. Aby to zrobić, dodajemy magiczną metodę __call do ConvenienceModel:

b45e29b9125c2ab565b5526442437686

To wezwanie jest więc możliwe również w powyższym przykładzie:

b45e29b9125c2ab565b5526442437686

Sprawdź puste obiekty

Jeśli chcesz wyprowadzić nazwę kraju na adres prywatny, często zobaczysz następujący kod:

b45e29b9125c2ab565b5526442437686

Aby temu zapobiec, dołączamy bibliotekę stringhelper i zwracamy specjalny obiekt pustej klasy, pusty, jeśli model nie zostanie znaleziony:

b45e29b9125c2ab565b5526442437686

To również sprawia, że ​​połączenie jest pomyślne (w tym przykładzie, jeśli coś zostanie znalezione, wyświetlana jest nazwa kraju, we wszystkich innych przypadkach pusty ciąg).

b45e29b9125c2ab565b5526442437686

Jeśli chcemy również pokryć przypadek, że użytkownik o ID 42 może nawet nie istnieć, zbudujemy do tego małą funkcję pomocniczą:

b45e29b9125c2ab565b5526442437686

Następujące wywołanie dostarcza zatem pusty łańcuch, nawet jeśli użytkownik w ogóle nie istnieje:

b45e29b9125c2ab565b5526442437686

Dogodnie przechodź przez relacje n: m

Na koniec chcemy uprościć następujący kod:

b45e29b9125c2ab565b5526442437686

W tym celu korzystamy z możliwości niestandardowych kolekcji . W pierwszej kolejności rozwijamy model wygody:

b45e29b9125c2ab565b5526442437686

Następnie tworzymy plik app \ Helpers \ ConvenienceCollection.php , który zapewnia, że ​​wywołanie nieznanych funkcji w kolekcjach powoduje wykonanie funkcji dla wszystkich elementów w kolekcji:

b45e29b9125c2ab565b5526442437686

Możemy więc użyć następującego kodu, aby wyświetlić wszystkie nazwy wszystkich krajów i wszystkie adresy wszystkich rodziców danej osoby:

b45e29b9125c2ab565b5526442437686

Ale możliwe są również połączenia takie jak poniżej:

b45e29b9125c2ab565b5526442437686

Sortuj według wielu kolumn

Poniższe wywołanie sortuje tylko według lokalizacji , chociaż prawdopodobnie nie tego chciałeś:

b45e29b9125c2ab565b5526442437686

Aby umożliwić sortowanie według kilku kolumn, rozszerzamy naszą ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Dzięki temu możemy posortować kolekcję według kilku kolumn za pomocą:

b45e29b9125c2ab565b5526442437686

Sortowanie standardowe

Poszerzamy ConvenienceCollection o kolejną funkcję pomocniczą:

b45e29b9125c2ab565b5526442437686

Teraz możesz nadać każdemu modelowi indywidualną standardową funkcję sortowania:

b45e29b9125c2ab565b5526442437686

Więc możemy posortować kolekcję za pomocą:

b45e29b9125c2ab565b5526442437686

Nazwy obiektów

Każdy model implementuje metodę getLabel (getName różni się w zależności od modelu):

b45e29b9125c2ab565b5526442437686

Dzięki temu możesz szybko i łatwo wyświetlić nazwę obiektu. Następnie można zaimplementować metodę pomocniczą sortByLabel w ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Puste wyniki

Jeśli krok pośredni jest pusty, funkcje Laravela first () i last () zwykle zwracają zero. Dlatego wprowadzamy getFirst () i getLast (), aby następujące wywołanie zawsze się powiodło:

b45e29b9125c2ab565b5526442437686

Niniejszym dostarczamy z powrotem __empty_helper, który rozpoznaje __x:

b45e29b9125c2ab565b5526442437686

Plecy