Laravel 5

[ELOQUENT] Relation HasManyThrough

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    6

    Bonjour,

    Je suis debutant sur laravel 5 depuis une semaine.

    J'ai pu experimenté la relation N-M "BelongsToMany" entre 2 table et une 1 table associative et ca fonctionne.

    les tables sont "Employees" "Entreprises" "Employees_Entreprises".

    Desormais, je souhaite crée une table "Candidatures" liée a la table "Employees" avec une liaison A-N dans le sens Employee -> Candidatures.

    Cependant, je souhaite a l'avenir recuperer une candidature et avoir le nom de l'entreprise de l'employee.

    J'ai penser a la relation HasManyThrough mais sur les documentations, il l'applique sur 3 table uniquement alors que moi j'en ai quatre.

    Que me conseillez vous pour obtenir le resultat desiré ?

    Je vous remercie d'avance pour l'aide

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

    Bonjour,

    Il faut faire de l'eager loading sur les relations (à condition qu'elles soient bien contruites) :

    $candidature = Candidature::with('employees.entreprises')->find($candidature_id);

    Là j'ai pris comme exemple que tu as l'id de la candidature.

    A la sortie tu as une collection avec les données des enregistrements en relation que tu peux récupérer avec une boucle.

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    6

    Salut bestmomo,

    Dans ma table "employees.entreprises" je n'ai pas de 'candidature_id', j'ai seulement 'employee_id' et 'entreprise_id'.

    le cheminement de ma table est : "candidatures" <---> "employee" <---> "employees.entreprise" <---> "entreprises".

    et dans ma table candidatures, j'ai "employee_id" qui va me servir de point de depart pour trouver le nom de l'entreprise avec entreprise_id en bout de chaine.

    L'eager loading est vraiment la bonne methode ? tu peux me confirmer ta ligne d'instruction car elle me semble pas adapté a mon cas...

    Merci momo !!

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

    Salut,

    'employees.entreprises' n'est pas une table mais de l'eager loading imbriqué. Autrement dit on a la fonction employees dans le modèle Candidature et la fonction entreprises dans le modèle Employe.

    J'ai mis $candidature_id juste pour représenter l'identifiant de la candidature, ce n'est qu'un exemple et ça n'a rien à voir avec les colonnes des tables.

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    6

    Salut,

    je comprends vraiment pas comment faire mon eager loading ...les donnée attendu...

    Pourrais tu m'aider a creer ma ligne d'instruction stp ?

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

    Salut,

    Si tu as bien les relations que tu as décrites alors disons que tu veux récupérer une candidature et que tu possèdes son id dans une variable $candidature_id. Tu veux aussi l'employé et les entreprises (puisque que c'est une relation n:n il peut appratenir à plusieurs entreprises).

    Alors avec ce code :

    $candidature = Candidature::with('employees.entreprises')->find($candidature_id);
    dd($candidature);

    Tu obtiens tout ça dans $candidature dans une collection qu'il faut parcourir.

    Ca va t'afficher cette collection et tu pourras en voir la structure.

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    6

    $candidature = Candidature::with('employee.entreprises')->find($candidature_id); Jai enleve le 's'

    ca fonctionne j'ai bien la sortie JSON dans ma console !!

    employee et entreprises correspond a quoi ? le nom des methodes dans le model ??

    Voici mes models et ces fonctions :

    class Candidature extends Model
    public function employee() ->belongsTo('App\Employee');
    class Employee extends Model
    public function entreprises() ->belongsToMany('App\Entreprise');
    public function candidatures() ->hasMany('App\Candidature');
    Class Entreprise extends Model
    public function employees() >belongsToMany('App\Employee')

    j'ai pas de model bien sur pour la table PIVOT employee.entreprise

    je vois bien le nom de l'entreprise concerné par la candidature mais je peux utiliser quoi comme fonction membre pour recuperer la bonne valeur ?

    Au passage tu pourrais mettre sur ton site different d'exemple d'eager loading concernant different cas ??

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

    Oui employee et entreprises correspondent au noms des methodes des relations dans les modèles.

    Pour récupérer les information tout dépend si on a une relation à un ou à plusieurs. Pour récupérer l'employé à partir de la candidature c'est direct :

    $candidature->employee->nom

    Pour les entreprises comme on peut en avoir plusieurs il faut faire une boucle :

    foreach($candidature->employee->entreprises as $entreprise {
    echo $entreprise->nom;
    }

    Pour mon blog c'et une idée effectivement.

  • Avatar de jamalinformatique
    Membre depuis :
    21/09/2017
    Messages :
    6

    ahh ok parfait !!

    je vais essayé avec d'autre model et d'autre relation.

    bonne journée momo !

Vous ne pouvez pas répondre à ce sujet.