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 ?

105voto

user2317976 Points 1075

Modifiez votre modèle pour préciser les colonnes que vous souhaitez sélectionner :

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

Et n'oubliez pas d'indiquer la colonne à laquelle vous vous joignez.

36voto

Javi Stolz Points 861

Pour Laravel >= 5.2

Utilisez le ->pluck() méthode

$roles = DB::table('roles')->pluck('title');

Si vous souhaitez récupérer un tableau contenant les valeurs d'une seule colonne, vous pouvez utiliser la méthode pluck


Pour Laravel <= 5.1

Utilisez le ->listes() méthode

$roles = DB::table('roles')->lists('title');

Cette méthode renvoie un tableau de titres de rôles. Vous pouvez également spécifier une colonne clé personnalisée pour le tableau retourné :

34voto

Melvin Points 660

Vous pouvez fournir un tableau de champs dans le paramètre get comme suit :

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

MISE À JOUR (pour Laravel 5.2) Depuis le docs vous pouvez le faire :

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

27voto

aykut Points 2809

Je sais, vous demandez Eloquent mais vous pouvez le faire avec Constructeur de requêtes fluides

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

17voto

Sajjad Ashraf Points 301

C'est comme ça que je fais

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

La première réponse de l'utilisateur2317976 n'a pas fonctionné pour moi, j'utilise laravel 5.1.

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