Tricks til Laravel Eloquent Relationships

En af Laravels styrker er dens elegante syntaks. Hvis du har mange modeller og relationer i Laravel (på grund af mange tabeller i databasen), kan traversering ofte ende i mindre elegant kode. I løbet af tiden har tre små udvidelser vist sig for mig, som jeg kort vil introducere nedenfor. Vi bruger bare nogle arv, magiske metoder og brugerdefinerede samlinger.


Først opretter vi en ny model under app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Derefter lader vi alle modeller arve fra vores nye komfortmodel:

b45e29b9125c2ab565b5526442437686

Bland dine egne funktioner med relationer

Hvis du vil hente tilsluttede modeller, bruger du standardsyntaxen til at kalde dem:

b45e29b9125c2ab565b5526442437686

Hvis du nu tilføjer din egen forretningslogik, kan du godt lide at bruge (nedre) kamelnotation:

b45e29b9125c2ab565b5526442437686

Vi ønsker at standardisere syntaksen for begge varianter. For at gøre dette tilføjer vi den magiske metode __call til ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Dette opkald er derfor også muligt i eksemplet ovenfor:

b45e29b9125c2ab565b5526442437686

Kontroller tomme genstande

Hvis du vil sende navnet på landet til en personlig adresse, vil du ofte se følgende kode:

b45e29b9125c2ab565b5526442437686

For at forhindre dette inkluderer vi stringhelper- biblioteket og returnerer et specielt objekt fra den tomme klasse tomt, hvis en model ikke findes:

b45e29b9125c2ab565b5526442437686

Dette gør også opkaldet vellykket (hvis der findes noget i dette eksempel, sendes landets navn, i alle andre tilfælde en tom streng).

b45e29b9125c2ab565b5526442437686

Hvis vi også ønsker at dække sagen om, at brugeren med ID 42 måske ikke engang eksisterer, bygger vi også en lille hjælperfunktion til dette:

b45e29b9125c2ab565b5526442437686

Det følgende opkald leverer således en tom streng, selvom brugeren slet ikke findes:

b45e29b9125c2ab565b5526442437686

Bekvemt krydser n: m-forhold

Endelig vil vi forenkle følgende kode:

b45e29b9125c2ab565b5526442437686

Til dette bruger vi muligheden for brugerdefinerede samlinger . Vi er først udvide bekvemmelighed model:

b45e29b9125c2ab565b5526442437686

Derefter opretter vi filappen \ Helpers \ ConvenienceCollection.php , som sikrer, at opkald til ukendte funktioner i samlinger udfører funktionen for alle elementer i samlingen:

b45e29b9125c2ab565b5526442437686

Så vi kan bruge følgende kode til at udskrive alle navne i alle lande på alle adresser til alle personens forældre:

b45e29b9125c2ab565b5526442437686

Men opkald som følgende er også mulige:

b45e29b9125c2ab565b5526442437686

Sorter efter flere kolonner

Det følgende opkald sorteres kun efter sted , selvom det sandsynligvis ikke var det, du ønskede:

b45e29b9125c2ab565b5526442437686

For at muliggøre sortering efter flere kolonner udvider vi vores ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Med det kan vi sortere samlingen efter flere kolonner med:

b45e29b9125c2ab565b5526442437686

Standard sortering

Vi udvider ConvenienceCollection med en anden hjælpefunktion:

b45e29b9125c2ab565b5526442437686

Nu kan du give hver model en individuel standardsorteringsfunktion:

b45e29b9125c2ab565b5526442437686

Så vi kan sortere en samling med:

b45e29b9125c2ab565b5526442437686

Objektnavne

Hver model implementerer getLabel-metoden (getName varierer afhængigt af modellen):

b45e29b9125c2ab565b5526442437686

Med dette kan du hurtigt og nemt sende navnet på et objekt. Du kan derefter implementere sortByLabel-hjælpemetoden i ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Tomme resultater

Hvis et mellemliggende trin er tomt, returnerer Laravel først () og sidste () normalt nul. Derfor introducerer vi getFirst () og getLast (), så følgende opkald altid lykkes:

b45e29b9125c2ab565b5526442437686

Med dette leverer vi en __empty_helper, som __x genkender:

b45e29b9125c2ab565b5526442437686

Tilbage