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 i mindre elegant kod. Med tiden har tre små tillägg visat sig vara framgångsrika för mig, som jag kort skulle vilja presentera nedan. För att göra detta använder vi bara lite 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 också möjligt i exemplet ovan:

b45e29b9125c2ab565b5526442437686

Kontrollera tomma föremål

Om du vill skriva ut landets namn för en personlig 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 tomt om en modell inte hittas:

b45e29b9125c2ab565b5526442437686

Detta betyder att anropet lyckades (i det här exemplet, om något hittas, matas namnet på landet 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

Vi skapar sedan filen app\Helpers\ConvenienceCollection.php , som säkerställer att anrop av okända funktioner för 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 sorteras bara efter plats , även om det förmodligen inte var önskvärt:

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