Laravel 5

Eloquent Relations - Récupèrer des données à travers des relations

  • Avatar de Youkoulayley
    Membre depuis :
    25/09/2016
    Messages :
    17

    Bonjour,

    Pour vous exposer un peu le problème, je suis en train de réaliser un système de fil d'actualité à partir de différent models. Il s'agit d'un système de notation d'épisodes de séries
    J'ai donc ces tables :
    episodes :
    id,
    number,
    season_id,
    ....

    seasons:
    id,
    number,
    show_id,
    ...

    shows:
    id,
    name,
    ....

    Chaque utilisateur a le droit de noter un épisode. J'ai donc ces tables :
    users:
    id,
    username,
    ...

    episode_user:
    episode_id,
    user_id,
    rate,
    updated_at

    Ce que j'ai réussi à faire, c'est faire le fil d'actualité au niveau d'un épisode (c'était le plus facile en même temps :p).
    Pour cela, j'ai cette relation :
    return $this->belongsToMany('App\Models\User')->withPivot('rate', 'updated_at');

    Et j'affiche dans ce fil d'actualité, le numéro de la saison, le numéro de l'épisode, le nom d'utilisateur, la note, et la date.

    Ce qui m'embete plus, c'est quand je passe à la saison et à la série.
    Par exemple, pour la saison, j'ai défini cette relation :
    return $this->hasManyThrough('App\Models\Episode_user', 'App\Models\Episode')->orderBy('episode_user.updated_at', 'desc');

    J'arrive donc à récupèrer les notes pour tous les épisodes d'une saison. Par contre, je n'arrive pas à récupèrer le numéro de l'épisode et le username de l'utilisateur.
    Ce qui est embêtant.

    Est-ce qu'il y a quelque chose que j'ai râté dans la doc pour faire ce genre de choses ?

    Merci d'avance !

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

    Salut,

    Tu devrais lire le chapitre sur l'eager loading dans la documentation parce que tu vas y trouver tes réponses, du moins une bonne partie.

  • Avatar de Youkoulayley
    Membre depuis :
    25/09/2016
    Messages :
    17

    Ah, je ne connaissais pas cette notation pour charger des relations en cascade.
    En revanche, en exécutant cette requête :

    $ratesSeason = Season::select('id','name')
    ->with(['episodes.users' => function($query){
    $query->select('username', 'episode_user.updated_at', 'rate');
    }])
    ->where('id', '=', $seasonInfo->id)
    ->first()
    ->toArray();

    J'ai quelque chose comme ça

    array:3 [▼
    "id" => 32
    "name" => 1
    "episodes" => array:10 [▼
    0 => array:18 [▼
    "id" => 693
    "thetvdb_id" => 4663020
    "episode_url" => null
    "numero" => 1
    "name" => "Uno"
    "name_fr" => null
    "diffusion_us" => "2015-02-08"
    "diffusion_fr" => "2015-02-08"
    "ba" => null
    "moyenne" => 16.5
    "nbnotes" => 2
    "season_id" => 32
    "created_at" => "2017-08-30 11:45:01"
    "updated_at" => "2017-09-06 15:17:52"
    "picture" => "https://thetvdb.com/banners/episodes/273181/4663020.jpg"
    "users" => array:2 [▼
    0 => array:4 [▼
    "username" => "admin"
    "updated_at" => "2017-09-05 10:38:27"
    "rate" => 17

    C'est presque ça, le problème, c'est que je voudrais récupérer les notes par date, et la je me retrouve à devoir boucler sur chaque épisode, et du coup j'aurai un tri par épisode et par date de note.
    Si j'inverse la requête en :

    $ratesSeason = Season::select('id','name')
    ->with('users.episodes')
    ->where('id', '=', $seasonInfo->id)
    ->first()
    ->toArray();

    J'ai :

    Call to undefined relationship [episodes] on model [App\Models\Episode_user].

    Ce qui est normal, mais est-ce que ça veut dire que je dois créer une relation sur le model Episode_user qui est censé être juste une table de relation ?

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

    Salut,

    Rien ne t'empêche d'avoir un modèle et des relations sur un pivot, on s'arrange un peu comme on veut selon les besoins.

  • Avatar de Youkoulayley
    Membre depuis :
    25/09/2016
    Messages :
    17

    Hello,

    Ok, ça marche, j'ai fait ça et ça fonctionne plutôt bien effectivement !

    Je te remercies bestmomo ;)

Vous ne pouvez pas répondre à ce sujet.