109 votes

Laravel Eloquent : Comment obtenir seulement certaines colonnes de tables jointes

J'ai deux tables jointes dans Eloquent, à savoir les thèmes et les utilisateurs.

modèle de thème :

public function user() {
  return $this->belongs_to('User');
}

modèle d'utilisateur :

public function themes() {
  return $this->has_many('Theme');
}

Mon appel api Eloquent ressemble à ce qui suit :

return Response::eloquent(Theme::with('user')->get());

Ce qui renvoie toutes les colonnes du thème (c'est bien), et toutes les colonnes de l'utilisateur (ce n'est pas bien). Je n'ai besoin que de la colonne 'username' du modèle user, comment puis-je limiter la requête à cela ?

14voto

Nufayl Points 264

Utilisation avec la pagination

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);

11voto

Jason Lewis Points 8273

Une autre option consiste à utiliser l'option $hidden sur le modèle pour masquer les colonnes que vous ne souhaitez pas afficher. Vous pouvez définir cette propriété à la volée ou définir des valeurs par défaut sur votre modèle.

public static $hidden = array('password');

Maintenant, le mot de passe de l'utilisateur sera caché lorsque vous retournerez la réponse JSON.

Vous pouvez également le régler à la volée de la même manière.

User::$hidden = array('password');

6voto

KinoP Points 1226

L'utilisateur2317976 a introduit un excellent moyen statique de sélectionner les colonnes des tables liées.

Voici une astuce dynamique que j'ai trouvée pour que vous puissiez obtenir ce que vous voulez en utilisant le modèle :

return Response::eloquent(Theme::with(array('user' => function ($q) {
    $q->addSelect(array('id','username'))
}))->get();

Je viens de découvrir que cette astuce fonctionne aussi bien avec load(). C'est très pratique.

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});

Veillez à inclure également la clé de la table cible, sinon le système ne pourra pas la trouver.

6voto

Specs Points 98

Par ici :

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

5voto

Armen Markossyan Points 338

Je sais qu'il s'agit d'une vieille question, mais si vous construisez une API, comme le fait l'auteur de la question, utilisez des transformateurs de sortie pour effectuer ces tâches.

Transofrmer est une couche entre le résultat réel de la requête de votre base de données et un contrôleur. Il permet de contrôler et de modifier facilement ce qui va être transmis à un utilisateur ou à un consommateur d'API.

Je recommande Fractal comme une base solide de votre couche de transformation de sortie. Vous pouvez lire la documentation aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X