Astuces pour les relations éloquentes avec Laravel

L'une des forces de Laravel est sa syntaxe élégante. Si vous avez beaucoup de modèles et de relations dans Laravel (en raison du grand nombre de tables dans la base de données), la traversée peut souvent se terminer par un code moins élégant. Au fil du temps, trois petites extensions ont fait leurs preuves pour moi, que je voudrais présenter brièvement ci-dessous. Nous utilisons juste un héritage, des méthodes magiques et des collections personnalisées.


Nous créons d'abord un nouveau modèle sous app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Ensuite, nous laissons tous les modèles hériter de notre nouveau modèle ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Mélangez vos propres fonctions avec des relations

Si vous souhaitez obtenir des modèles connectés, vous utilisez la syntaxe standard pour les appeler:

b45e29b9125c2ab565b5526442437686

Si vous ajoutez maintenant votre propre logique métier, vous aimez utiliser la notation en cas de chameau (inférieure):

b45e29b9125c2ab565b5526442437686

Nous voulons normaliser la syntaxe des deux variantes. Pour ce faire, nous ajoutons la méthode magique __call au modèle ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Cet appel est donc également possible dans l'exemple ci-dessus:

b45e29b9125c2ab565b5526442437686

Vérifier les objets vides

Si vous souhaitez afficher le nom du pays à l'adresse d'une personne, vous verrez souvent le code suivant:

b45e29b9125c2ab565b5526442437686

Pour éviter cela, nous incluons la bibliothèque stringhelper et retournons un objet spécial de la classe vide vide si un modèle n'est pas trouvé:

b45e29b9125c2ab565b5526442437686

Cela rend également l'appel réussi (dans cet exemple, si quelque chose est trouvé, le nom du pays est affiché, dans tous les autres cas, une chaîne vide).

b45e29b9125c2ab565b5526442437686

Si nous voulons également couvrir le cas où l'utilisateur avec l'ID 42 peut même ne pas exister, nous allons également créer une petite fonction d'aide pour cela:

b45e29b9125c2ab565b5526442437686

L'appel suivant délivre donc une chaîne vide même si l'utilisateur n'existe pas du tout:

b45e29b9125c2ab565b5526442437686

Traversez facilement les relations n: m

Enfin, nous souhaitons simplifier le code suivant:

b45e29b9125c2ab565b5526442437686

Pour cela, nous utilisons la possibilité de collections personnalisées . Nous élargissons d'abord le modèle de commodité:

b45e29b9125c2ab565b5526442437686

Ensuite, nous créons le fichier app \ Helpers \ ConvenienceCollection.php , qui garantit que l'appel de fonctions inconnues dans les collections exécute la fonction pour tous les éléments de la collection:

b45e29b9125c2ab565b5526442437686

Nous pouvons donc utiliser le code suivant pour afficher tous les noms de tous les pays de toutes les adresses de tous les parents de la personne:

b45e29b9125c2ab565b5526442437686

Mais des appels comme ceux-ci sont également possibles:

b45e29b9125c2ab565b5526442437686

Trier par plusieurs colonnes

L'appel suivant ne trie que par emplacement , bien que ce ne soit probablement pas ce que vous vouliez:

b45e29b9125c2ab565b5526442437686

Pour permettre le tri selon plusieurs colonnes, nous élargissons notre ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Avec cela, nous pouvons trier la collection selon plusieurs colonnes avec:

b45e29b9125c2ab565b5526442437686

Tri standard

Nous étendons la ConvenienceCollection avec une autre fonction auxiliaire:

b45e29b9125c2ab565b5526442437686

Vous pouvez désormais attribuer à chaque modèle une fonction de tri standard individuelle:

b45e29b9125c2ab565b5526442437686

Nous pouvons donc trier une collection avec:

b45e29b9125c2ab565b5526442437686

Noms d'objets

Chaque modèle implémente la méthode getLabel (getName varie en fonction du modèle):

b45e29b9125c2ab565b5526442437686

Avec cela, vous pouvez sortir rapidement et facilement le nom d'un objet. Vous pouvez ensuite implémenter la méthode d'assistance sortByLabel dans le ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Résultats vides

Si une étape intermédiaire est vide, les fonctions Laravel first () et last () renvoient généralement zéro. Par conséquent, nous introduisons getFirst () et getLast () afin que l'appel suivant réussisse toujours:

b45e29b9125c2ab565b5526442437686

Par la présente, nous vous renvoyons un __empty_helper que __x reconnaît:

b45e29b9125c2ab565b5526442437686

Retour