11
votes

Interroger un modèle associé dans une portée de la requête Laravel

J'ai une méthode d'étendue de requête qui filtre les résultats sur un modèle FOO par l'auteur du modèle. La complication est que l'auteur n'est pas directement lié.

FOO appartient à la barre et à la barre appartient à l'utilisateur. Si FOO appartenait à l'utilisateur, je pouvais juste faire cela: xxx

Ceci ne fonctionnera évidemment pas car le modèle FOO n'a pas de colonne user_id et a plutôt une colonne bar_id. Cependant, je ne suis pas sûr de savoir comment je peux construire la requête d'une manière qui filtrerait l'user_id.

Tous les pointeurs?


0 commentaires

3 Réponses :


6
votes

trouvé une solution: xxx


3 commentaires

J'ai posté une réponse au Laravel, veuillez également vérifier cela.


C'est mieux que possible, car il utilise index de table et travailler plus efficace, mais n'oubliez pas d'ajouter -> Sélectionnez ("Utilisateurs. *") Sinon Laravel peut vous donner "ID" ou tout autre champ de la mauvaise table, et pas d'erreur. sera jeté.


C'est mieux si vous êtes coincé avec MySQL. Les autres moteurs peuvent en résulter des erreurs sur ces requêtes. OP n'a jamais mentionné quel moteur DB il utilise.



8
votes

Vous pouvez également faire cela à l'aide de relations (sans recourir à des jointures manuelles): xxx

edit: utilise maintenant au lieu de avec > (Laravel> = 4.1 seulement). Merci pour la correction ARDA.

EDIT: Dans 4.2, la syntaxe de l'où a changé, de sorte que le nom de la relation est paramètre 1 et la fermeture est le paramètre 2 (plutôt que d'être transmis comme une matrice): < / p> xxx


2 commentaires

Cela n'affectera pas le filtrage principal de la requête, mais il ne s'agira que d'affecter les résultats en relation.


Merci pour la correction concernant l'utilisation de au lieu de avec pour affecter la requête principale.



20
votes

Vous pouvez utiliser où () dans les champs de requête pour interroger les relations.

Supposons que vous avez un utilisateurs () fonction de relation dans ce modèle. Ensuite, ce serait quelque chose comme ceci: xxx

mise à jour: Vous pouvez également nier déclarations: si le courant FOO a une relation nommée bar et bar a une relation appelée utilisateurs , ce serait comme ceci: xxx

Plus d'infos: ici


1 commentaires

La question a demandé une solution où FOO appartient à la barre et à la barre appartient à l'utilisateur. Votre réponse suppose que FOO appartient directement à l'utilisateur.