Laravel 5

Relations entre 3 tables

  • Avatar de Guilux
    Membre depuis :
    06/09/2018
    Messages :
    3

    Bonjour,

    J'ai 3 tables (Equipe,Entraineur,Delegue), chaque equipe à 1 entraineur et 1 délégué. Un entraineur ou un délégué peuvent avoir plusieurs équipes. (voir schéma)
    Image

    Je voudrais pouvoir récuperer la liste des équipes avec en relation l'entraineur et le délégué pour afficher un tableau dans ce style.

    NomEquipe, NomEntraineur, NomDélégué.

    Voici ma définiton des modeles

    Entraineur

    public function equipe()
    {
    return $this->hasMany('App\Models\Equipe');
    }

    Delegue

    public function equipe()
    {
    return $this->hasMany('App\Models\Equipe');
    }

    Equipe

    public function entraineur(){

    return $this->belongsTo('App\Models\Entraineur');
    }
    public function delegue(){

    return $this->belongsTo('App\Models\Delegue');
    }

    Mais dans mon controlleur, je n'arrive pas à faire ma requete.

    Je suppose que je dois faire un truc du style

    $equipes = Equipe::all() ->with('entraineur')->with('delegue');

    mais cela ne fonctionne pas. Je m'y prends surement mal.

    Pourriez vous m'aider? Merci d'avance

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    173

    Et un truc dans ce genre :

    $equipes = Equipe::with(['entraineur' => function ($query) {
    $query->select('nom','prenom','id');
    }])->with(['delegue' => function ($query){
    $query->select('nom','prenom','id');
    }])->get();
  • Avatar de Guilux
    Membre depuis :
    06/09/2018
    Messages :
    3

    Merci MaitrePylos, c'est exactement cela, cela fonctionne parfaitement.

    j'ai encore un peu de mal avec le Eager Loads ;-)

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2079

    On peut simplifier :

    $equipes = Equipe::with('entraineur','delegue')->get();
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2079

    Bon ne tenez pas compte de ma précédente réponse sur mon téléphone j'arrive pas à éditer le code. Je voulais juste mettre les deux relations entre parenthèses et supprimer les sélect.

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    173

    Oui, mais les selects permet de faire une requete formalisé, j'aurais pu faire aussi un seul with, mais c'est moins clair.
    Et je préfère les vrais requêtes avec DB:: :) (faut toujours que je le dise)

  • Avatar de Guilux
    Membre depuis :
    06/09/2018
    Messages :
    3

    Merci à vous 2 ;-)

    MaitrePylos, au niveau performance c'est mieux d'utiliser éloquentv ou directement les requetes avec DB:: ?

    ps: Bestmomo, merci pour tes tutos Laravel, une vraie mine d'or... on voit que tu es un passionné

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    173

    Jamais fait de bench...., mais il me semble que passer par PDO doit être plus performant que de faire construire sa requête.

    De plus, si tu as installé la barre de debug, tu pourras voir qu'il fait trois requêtes séparées pour ta demande, ensuite il englobe le tout.

    Alors que par PDO, j'aurai fait une seule requête.

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2079

    J'ai aussi été nourri à l'ancienne école du SQL et de PDO mais j'ai glissé dans la facilité d'Eloquent... Il faudrait faire quelques benchmark pour comparer...

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    173

    Personelement , je trouve Eloquent très sympa pour le crud, mais dès que cela deviens compliqué (plusieurs inner join, union ou CTE), alors je repasse d'office à lécriture de requête.
    Pour moi l'outils vraiment top (uiquement PostgreSQL), c'est POMM.....

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2079

    Je n'ai jamais utilisé PostgreSQL, quels avantages ?

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    173

    Long débat :)

    Rien que pour le CTE, la notion de schéma, le langage de programmation (pgsql).....j'en passe et des meilleurs
    Sur un gros projet, je n'hésite jamais.

Vous ne pouvez pas répondre à ce sujet.