0
votes

Obtenez tous les objets existants dans deux collections

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):

  1. La leçon est active, c'est-à-dire "où (" actif ", vrai)". Assez simple.
  2. La leçon fait partie d'une piste choisie par l'utilisateur. Les modèles sont mis en place avec de l'appartenance () (il s'agit d'une relation à plusieurs à plusieurs), afin que je puisse obtenir ces leçons par une simple piste de piste de $.
  3. C'est là que cela devient délicat. Certaines leçons ne devraient être visibles que pour les utilisateurs avec certains titres (c.-à-d. Il y a beaucoup à beaucoup de titres et de cours). Je peux obtenir les leçons avec l'exigence de titre correcte à l'aide d'Auth :: Utilisateur () -> Titre-> Leçons.

    question est comment je reçois tout cela ensemble. Le meilleur que j'ai montré cela est la suivante: xxx

    ... 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.

    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?


0 commentaires

3 Réponses :


0
votes

au lieu d'où l'utilisation de la relation "titres" xxx


0 commentaires

0
votes

Utiliser 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.

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>

    $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();


2 commentaires

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.



0
votes

Tout d'abord compliqué, vraiment compliqué . Votre structure de table nécessite une modification sérieuse pour faciliter la tâche.

Cependant, vous ne voulez pas descendre de cette route, vous pouvez le faire plus simple en utilisant rejoindre

En supposant que vous avez suivi une structure de table suivante:

  • utilisateurs
  • Titres (Clé étrangère User_id)
  • Leçons (a title_id Clé étrangère)
  • pistes (a la keine étrangère de leçon_id) XXX

    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 dans lequel au lieu de pour les titres.id Requête.

    J'espère que vous avez suffisamment de compréhension de la framework de Laravel pour comprendre et mettre en œuvre cette solution.

    Désolé, je n'ai pas assez de temps pour relire ou donner plus de détails. Bonne chance!

    bonne chance si vous avez besoin de pagination après cela: P Je doute de simple -> paginate () fonctionnera: d

    i J'espère que cela aide


2 commentaires

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?