Trucs voor Laravel Eloquent Relationships

Een van Laravel's sterke punten is de elegante syntaxis. Als je veel modellen en relaties in Laravel hebt (vanwege veel tabellen in de database), kan traversing vaak eindigen in minder elegante code. In de loop van de tijd hebben zich voor mij drie kleine uitbreidingen bewezen, die ik hieronder kort wil introduceren. We gebruiken alleen wat overerving, magische methoden en aangepaste verzamelingen.


Eerst maken we een nieuw model onder app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Vervolgens laten we alle modellen erven van ons nieuwe ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Combineer uw eigen functies met relaties

Als u aangesloten modellen wilt krijgen, gebruikt u de standaardsyntaxis om ze op te roepen:

b45e29b9125c2ab565b5526442437686

Als je nu je eigen bedrijfslogica toevoegt, gebruik je graag de (lagere) camel case-notatie:

b45e29b9125c2ab565b5526442437686

We willen de syntaxis van beide varianten standaardiseren. Om dit te doen, voegen we de magische methode __call toe aan het ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Deze oproep is dus ook mogelijk in bovenstaand voorbeeld:

b45e29b9125c2ab565b5526442437686

Controleer lege objecten

Als u de naam van het land naar een persoonlijk adres wilt uitvoeren, ziet u vaak de volgende code:

b45e29b9125c2ab565b5526442437686

Om dit te voorkomen, nemen we de stringhelper- bibliotheek op en retourneren we een speciaal object van de lege klasse leeg als er geen model wordt gevonden:

b45e29b9125c2ab565b5526442437686

Dit maakt de oproep ook succesvol (in dit voorbeeld, als er iets wordt gevonden, wordt de naam van het land weergegeven, in alle andere gevallen een lege string).

b45e29b9125c2ab565b5526442437686

Als we ook het geval willen dekken dat de gebruiker met ID 42 misschien niet eens bestaat, zullen we hiervoor ook een kleine hulpfunctie bouwen:

b45e29b9125c2ab565b5526442437686

De volgende aanroep levert dus een lege string op, zelfs als de gebruiker helemaal niet bestaat:

b45e29b9125c2ab565b5526442437686

Doorkruis gemakkelijk n: m relaties

Ten slotte willen we de volgende code vereenvoudigen:

b45e29b9125c2ab565b5526442437686

Hiervoor maken wij gebruik van de mogelijkheid van custom collecties . We breiden eerst het gemaksmodel uit:

b45e29b9125c2ab565b5526442437686

Vervolgens maken we het bestand app \ Helpers \ ConvenienceCollection.php , dat ervoor zorgt dat het aanroepen van onbekende functies in verzamelingen de functie uitvoert voor alle items in de verzameling:

b45e29b9125c2ab565b5526442437686

We kunnen dus de volgende code gebruiken om alle namen van alle landen of alle adressen van alle ouders van de persoon uit te voeren:

b45e29b9125c2ab565b5526442437686

Maar oproepen zoals de volgende zijn ook mogelijk:

b45e29b9125c2ab565b5526442437686

Sorteer op meerdere kolommen

De volgende oproep wordt alleen op locatie gesorteerd , hoewel dat waarschijnlijk niet was wat u wilde:

b45e29b9125c2ab565b5526442437686

Om sorteren op meerdere kolommen mogelijk te maken, breiden we onze ConvenienceCollection uit:

b45e29b9125c2ab565b5526442437686

Daarmee kunnen we de collectie sorteren op meerdere kolommen met:

b45e29b9125c2ab565b5526442437686

Standaard sortering

We breiden de ConvenienceCollection uit met een andere hulpfunctie:

b45e29b9125c2ab565b5526442437686

Nu kunt u elk model een individuele standaard sorteerfunctie geven:

b45e29b9125c2ab565b5526442437686

Zodat we een collectie kunnen sorteren met:

b45e29b9125c2ab565b5526442437686

Object namen

Elk model implementeert de methode getLabel (getName varieert afhankelijk van het model):

b45e29b9125c2ab565b5526442437686

Hiermee kunt u snel en eenvoudig de naam van een object uitvoeren. U kunt vervolgens de sortByLabel-helper-methode implementeren in de ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Lege resultaten

Als een tussenstap leeg is, retourneren de Laravel-functies first () en last () meestal nul. Daarom introduceren we getFirst () en getLast () zodat de volgende aanroep altijd slaagt:

b45e29b9125c2ab565b5526442437686

Hiermee leveren we een __empty_helper terug die __x herkent:

b45e29b9125c2ab565b5526442437686

Terug