0
votes

Comment charger de nombreuses relations et groupe par une relation imbriquée

Dans une application sportive, je souhaite afficher une liste d'équipes et des joueurs dans chaque équipe et que les joueurs ont été regroupés par leur position.

Voici comment les relations de modèle sont définies. P>

Chaque position est liée à un sport. Dans le football, vous auriez cf, st, gk, etc. dans le basketball que vous auriez pg, pf, c, etc. P> xxx pré>

la classe de position connaît chaque joueur qui joue la position. p> xxx pré>

Chaque joueur peut lire une position spécifique sur une seule équipe. P>

Team::with(['players.position' => function ($query) { /* insert groupBy magic */ }])->paginate();


3 commentaires

Essayer de définir la relation sport.Teams pour voir si cela fonctionne


Il n'y a pas de relation directe entre équipe et position . Sans relation, il est difficile de former le Json que vous vouliez. Vous êtes d'accord avec le JSON Teams-> Sports-> Positions-> Joueurs ?


@Sandeeffsudhakaran Oui, c'est totalement fin avec moi, mais quand j'essaie quelque chose à cet effet, je finis à obtenir des joueurs par position de toutes les équipes du même tableau. Pour une raison quelconque, les joueurs ne sont pas une portée à l'équipe lorsque je les obtiens à cette approche.


3 Réponses :


0
votes

Vous devez obtenir vos équipes puis charger d'autres données:

$teams->load('sport.positions.players')->paginate(5);


1 commentaires

Merci pour la réponse. J'ai essayé ceci: $ this-> équipes = \ app \ équipe :: tous (); $ ceci-> équipes => équipes-> Charge ('Sport.Positions. Les joueurs »); mais cela finit par charger (dans chaque objet d'équipe) tous les joueurs de chaque position, sans respecter le Team_id. Fondamentalement, je finis avec des joueurs pour diverses équipes dans le même tableau pour chaque équipe.



0
votes

Vous pouvez essayer ci-dessous Query:

$team = Team::with(['players','position'=>function($q){
   $q->groupBy('positio_name') ;
})->get();


0 commentaires

0
votes

pas exactement strong> em> ce que vous voulez, mais cela devrait vous donner quelque chose de plus proche.

Commencez par définir un équipes code> sur le APP \ SPORT CODE> P>

Sport::with(['teams.players.position'])->find($sport_id)
    ->setRelation('teams',  $sport->teams->map(function($team){
        return $team->setRelation('players', $team->players->groupBy(function($player){
            return $player->position->name;
        }));
    }));


0 commentaires