Comment trier un champ de tableau croisé dynamique de plusieurs-à-plusieurs relations dans Éloquent ORM

J'ai été en utilisant Éloquent ORM pour un certain temps maintenant, et je le sais très bien, mais je ne peux pas faire la suite, tandis que il est très facile à faire dans l'.

J'ai les utilisateurs avec un plusieurs-à-plusieurs chansons, table intermédiaire étant song_user (comme il convient). Je voudrais obtenir les meilleures chansons de l'utilisateur, à en juger par le nombre de lecture. Bien sûr, nombre de lecture est stocké dans la table intermédiaire.

Je peux le faire dans Fluent:

$songs = DB::table('songs')
    ->join('song_user', 'songs.id', '=', 'song_user.song_id')
    ->where('song_user.user_id', '=', $user->id)
    ->orderBy("song_user.play_count", "desc")
    ->get();

Facile. Mais je veux le faire dans Éloquent, qui, bien sûr, ne fonctionne pas:

$songs = Song::
    with(array("song_user" => function($query) use ($user) {
        $query->where("user_id", "=", $user->id)->orderBy("play_count", "desc");
    }))
  • Je n'ai pas de programme d'installation pour l'essayer, mais avez-vous essayé quelque chose comme $songs = $usr->songs()->pivot()->order_by('play_count','desc')->songs();? La Question est de savoir si vous pouvez "remonter" à songs après le tableau croisé dynamique, puisqu'il ne semble pas être un modèle normal.
  • Cela ne fonctionne pas, malheureusement.
  • Eh bien, vous pouvez toujours faire le tableau croisé dynamique d'un modèle et de travail à travers cela. Vous ne devez configurer d'autres clés étrangères, de sorte que les entrées sont correctement supprimés lorsque leurs parents respectifs est.
  • Je suis actuellement en train de le faire, mais en utilisant cette approche, vous perdez le filtrage automatique de l'utilisateur de chansons ($user->chansons()) et vous devez vous rappeler de le faire manuellement (SongUser::where("user_id", "=", $user->id)->etc...).
  • Pourquoi, c'est ce que les relations sont pour, au lieu d'un seul, plusieurs-à-plusieurs vous faire deux un-à-plusieurs relations avec le tableau croisé dynamique. Vous devriez juste ajouter quelque chose comme $this->has_many('song_user')
InformationsquelleAutor duality_ | 2013-01-13