Je construis une page de Laravel sur laquelle je veux montrer une liste de cours. Quelles leçons doivent figurer sur la page est filtrée par trois critères (dont tout devrait être vrai):
question est comment je reçois tout cela ensemble. Le meilleur que j'ai montré cela est la suivante: p> ... qui est la merde laide, clairement sous-optimale et (pour une raison quelconque je ne comprends vraiment pas ) Ne fonctionnera pas aussi (je ne reçois pas les leçons que mon titre me donne droit à ma liste). Eu du mal depuis quelques heures maintenant, je reçois le sentiment que je suis surchargée, d'abord des identifiants de cueillette, puis de les utiliser dans un endroit où () ne peut pas être un bon moyen de le faire. P> Alors Je peux facilement obtenir une collection de leçons sur la piste et je peux obtenir une collection de leçons appartenant au titre, mais comment puis-je obtenir tous les objets existants dans ces deux collections? P> P>
3 Réponses :
au lieu d'où l'utilisation de la relation "titres"
Utiliser Briser la requête à ses pièces: P> 1: Répondu p> 2: En supposant que l'inverse de $ de piste -> Les leçons de la succursale est la suivante:> pistes et $ la piste provient du code que vous n'avez pas inclus: p> où () code> est la réponse à vos préoccupations concernant les identifiants de cueillette. Au lieu d'exécuter des requêtes supplémentaires pour récupérer des identifiants,
où () code> attachera la contrainte à la requête d'origine en tant que sous-requête sur les tableaux associés.
$track = ???;
$title = Auth::user()->title;
$lessons = Lesson::where('active', true)
->whereHas('tracks', function ($query) use ($track) {
$query->where('id', $track->id);
})
->where(function ($query) use ($title) {
$query->whereHas('titles', function ($query) use ($title) {
$query->where('id', $title->id);
})
->orWhere('limited_by_title', false);
})
->get();
Ha! Après une bonne nuit de sommeil, il s'est avéré que mon code d'origine (celui de la question) a effectivement travaillé. Après des heures de tirage de mes cheveux, il semble que j'ai inactivé involontairement la leçon que mon titre devait me donner la permission de :-) Cependant, votre solution semble être une meilleure performance-sage (pas de cueillette) si évidemment je vais l'utiliser à la place. . Aussi grand merci pour la pointe TOSQL (). Je me sens beaucoup plus à la maison avec du code PURE SQL qu'avec cet orj qui est un monde totalement nouveau pour moi.
@DanielMalmgren Dans ce cas, j'ai ajouté un lien vers la documentation qui vous montre comment écouter les requêtes de base de données. Vous pouvez l'utiliser pour enregistrer les requêtes, ce qui m'a beaucoup aidé à comprendre comment les méthodes de l'orèse transformées en SQL.
Tout d'abord compliqué, Cependant, vous ne voulez pas descendre de cette route, vous pouvez le faire plus simple en utilisant rejoindre strud> p> En supposant que vous avez suivi une structure de table suivante: p> pistes (a la keine étrangère de leçon_id) p>
Bien sûr, si vos utilisateurs Tableau et Titres ont une relation à une sur une seule relation autrement piquant tous les titres_ids et utilisez J'espère que vous avez suffisamment de compréhension de la framework de Laravel pour comprendre et mettre en œuvre cette solution. P> Désolé, je n'ai pas assez de temps pour relire ou donner plus de détails.
Bonne chance! P> bonne chance si vous avez besoin de pagination après cela: P Je doute de simple i J'espère que cela aide em> p> p>
dans lequel code> au lieu de
où code> pour les titres.id Requête. P>
-> paginate () code> fonctionnera: d p>
Nan. Comme je l'ai mentionné dans ma question, les traces de cours et les leçons-titres sont nombreux à de nombreuses relations, de sorte que les titres ne disposent pas d'user_id et de leçons ne disposent pas de titres_id (il y a un leçon_title et une table de formation de la leçon entre elles.
Yup a raté cela, dans ce cas, vous voulez peut-être faire une table centrale comme suggérée par Laravel: laravel.com/docs/5.7/eloquent-Relationships#many-a-many Pour faciliter la requête?