Laravel 5

Récuperer données sur table pivot avec attribut en plus

  • Avatar de Somesa
    Membre depuis :
    05/08/2017
    Messages :
    1

    Bonjour,

    J'ai des professeurs et des eleves, tout deux sont dans la table "users" avec un role_id pour distinguer chacun (1: eleve / 2: prof)

    J'ai une relation n:n entre cette table Users et une table Classes, et la table pivot class_user contient un attribut en plus qui est l'année

    Un élève etudie dans 0 ou plusieurs classes (en fonction de l'année)
    (ex: en 2016 il est en classe C3 / en 2017 C4 / en 2018 non inscrit / en 2019 C3 ...etc)
    Un professeur donne cours à 0 ou plusieurs classes (en fonction de l'année)
    (ex: Mr Dupont enseigne en 2016 à C1, C2, C3/ en 2017 à C2,C3 / ...etc)

    Je me retrouve avec une table pivot du genre :

    | User | Class | Year |
    | ------ | ------ | ---- |
    | Eric | c3 | 2016 |
    | Eric | c4 | 2017 |
    | Eric | c3 | 2019 |
    | Dupont | c1 | 2016 |
    | Dupont | c2 | 2016 |
    | Dupont | c3 | 2016 |
    | Dupont | c2 | 2017 |
    | Dupont | c3 | 2017 |
    | ...... | ..... | ... |

    J'ai créé mes relations belongsToMany, le seul soucis c'est que je n'arrive pas a récuperer les eleves d'un professeur en particulier, pour une année en particulier.

    J'arrive à récuperer:

    les classes d'un professeur pour une année :

    $classes = User::where('id', 1)->first()
    ->classes()
    ->wherePivot('annee', 1)
    ->get();

    Les utilisateurs d'une classe pour une année (il suffit ensuite de distinguer les élèves des profs)

    $users = Classe::find(10)->load('users')->users()->wherePivot('annee', 1)->get();

    par contre pour récuperer les eleves d'un professeur pour une année c'est la que ca devient compliqué.
    J'ai essayé de faire un foreach sur $classes, puis de récuperer les utilisateurs mais il me renvoie beaucoup trop de resultats

    Merci pour votre aide

  • Avatar de stockhausen
    Membre depuis :
    05/11/2013
    Messages :
    34

    je pense que ta jointure est mal faite.

    peux tu mettre ton modèle ici ? et les champs de class_user

    $users = Classe::where('id',10)->whereHas('users',function($query){
    $query->where('annee',1);
    })->get();

    Voir cette doc.

    https://laravel.com/docs/5.4/eloquent-relationships#introduction

    If you need even more power, you may use the whereHas and orWhereHas methods to put "where" conditions on your has queries. These methods allow you to add customized constraints to a relationship constraint, such as checking the content of a comment:

    // Retrieve all posts with at least one comment containing words like foo%
    $posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
    })->get();

Vous ne pouvez pas répondre à ce sujet.