Tricks för Laravel Eloquent Relationships

En av Laravels styrkor är dess eleganta syntax. Om du har många modeller och relationer i Laravel (på grund av många tabeller i databasen) kan traversering ofta sluta med mindre elegant kod. Med tiden har tre små tillägg visat sig för mig, som jag kort vill presentera nedan. Vi använder bara några arv, magiska metoder och anpassade samlingar.


Först skapar vi en ny modell under app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Sedan låter vi alla modeller ärva från vår nya ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Blanda dina egna funktioner med relationer

Om du vill få anslutna modeller använder du standardsyntaxen för att ringa dem:

b45e29b9125c2ab565b5526442437686

Om du nu lägger till din egen affärslogik vill du använda (nedre) kamelnotationen:

b45e29b9125c2ab565b5526442437686

Vi vill standardisera syntaxen för båda varianterna. För att göra detta lägger vi till den magiska metoden __call till ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Detta samtal är därför också möjligt i exemplet ovan:

b45e29b9125c2ab565b5526442437686

Kontrollera tomma föremål

Om du vill mata ut namnet på landet till en persons adress ser du ofta följande kod:

b45e29b9125c2ab565b5526442437686

För att förhindra detta inkluderar vi stringhelper- biblioteket och returnerar ett specialobjekt av den tomma klassen tom om en modell inte hittas:

b45e29b9125c2ab565b5526442437686

Detta gör också att samtalet lyckas (i det här exemplet, om något hittas, matas landets namn ut, i alla andra fall en tom sträng).

b45e29b9125c2ab565b5526442437686

Om vi ​​också vill täcka fallet att användaren med ID 42 kanske inte ens finns, kommer vi också att bygga en liten hjälpfunktion för detta:

b45e29b9125c2ab565b5526442437686

Följande samtal levererar således en tom sträng även om användaren inte existerar alls:

b45e29b9125c2ab565b5526442437686

Bekvämt korsar n: m-relationer

Slutligen vill vi förenkla följande kod:

b45e29b9125c2ab565b5526442437686

För detta använder vi möjligheten till anpassade samlingar . Vi utökar först bekvämlighetsmodellen:

b45e29b9125c2ab565b5526442437686

Sedan skapar vi filappen \ Helpers \ ConvenienceCollection.php , vilket säkerställer att anropa okända funktioner i samlingar kör funktionen för alla objekt i samlingen:

b45e29b9125c2ab565b5526442437686

Så vi kan använda följande kod för att mata ut alla namn i alla länder på alla adresser till personens föräldrar:

b45e29b9125c2ab565b5526442437686

Men samtal som följande är också möjliga:

b45e29b9125c2ab565b5526442437686

Sortera efter flera kolumner

Följande samtal sorterar bara efter plats , även om det förmodligen inte var det du ville ha:

b45e29b9125c2ab565b5526442437686

För att möjliggöra sortering enligt flera kolumner utökar vi vår ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Med det kan vi sortera samlingen efter flera kolumner med:

b45e29b9125c2ab565b5526442437686

Standard sortering

Vi utökar ConvenienceCollection med en annan hjälpfunktion:

b45e29b9125c2ab565b5526442437686

Nu kan du ge varje modell en individuell standardsorteringsfunktion:

b45e29b9125c2ab565b5526442437686

Med detta kan vi sortera en samling med:

b45e29b9125c2ab565b5526442437686

Objektnamn

Varje modell implementerar getLabel-metoden (getName varierar beroende på modell):

b45e29b9125c2ab565b5526442437686

Med detta kan du snabbt och enkelt mata ut namnet på ett objekt. Du kan sedan implementera sortByLabel-hjälparmetoden i ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Tomma resultat

Om ett mellansteg är tomt, fungerar Laravel först () och sista () brukar returnera noll. Därför introducerar vi getFirst () och getLast () så att följande samtal alltid lyckas:

b45e29b9125c2ab565b5526442437686

Härmed levererar vi tillbaka en __empty_helper som __x känner igen:

b45e29b9125c2ab565b5526442437686

Tillbaka