Obtenir des colonnes spécifiques en utilisant la fonction" avec () " dans Laravel Eloquent

j'ai deux tables User et Post Un User ont beaucoup de posts et un post appartient qu'à un seul user .

Dans mon User Modèle que j'ai hasMany relation comme

public function post(){
        return $this->hasmany('post');
}

et dans mon post modèle j'ai belongsTo relation comme

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

maintenant je veux joindre de ces deux tables en utilisant Eloquent with() mais je veux spécifique colonnes du deuxième tableau. Je sais que je peux utiliser query Builder mais je ne veux pas l'utiliser. Quand dans post modèle j'écris

public function getAllPosts() {
        return Post::with('user')->get();
}

Il exécute les requêtes suivantes

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

Mais ce que je veux

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

quand j'utilise

Post::with('user')->get(array('columns'....));

il renvoie seulement la colonne du premier tableau. Je veux des colonnes spécifiques en utilisant with() de la deuxième table. Comment puis-je le faire?

107
demandé sur tisuchi 2013-11-08 10:30:34

8 réponses

J'ai trouvé la solution. Il peut être fait un en passant une fonction closure dans with() comme deuxième index de tableau comme

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

il sélectionnera seulement id et username d'un autre tableau. J'espère que cela aidera d'autres.


rappelez-vous que la clé primaire (id dans ce cas) est nécessaire dans le $query - >select() pour réellement récupérer les résultats nécessaires.

220
répondu Awais Qarni 2016-01-28 23:25:36

dans votre Post modèle

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

crédit initial attribué à Laravel Eager Loading-Load only colonnes spécifiques

59
répondu user1669496 2017-05-23 12:18:20

Lorsque dans l'autre sens (hasMany):

User::with(array('post'=>function($query){
        $query->select('id','user_id');
    }))->get();

n'oubliez pas d'inclure la clé étrangère (en supposant qu'elle soit user_id dans cet exemple) pour résoudre la relation, sinon vous obtiendrez zéro résultat pour votre relation.

42
répondu Thijs 2015-08-24 15:05:51

vous pouvez le faire comme ceci dans Laravel 5.5:

Post::with('user:id,username')->get();

prendre Soin de la id champ comme indiqué dans le docs :

lorsque vous utilisez cette fonctionnalité, vous devez toujours inclure la colonne id dans la liste des colonnes que vous souhaitez récupérer.

26
répondu Adam 2017-11-11 13:12:03

dans Laravel 5.6 vous pouvez appeler le champ spécifique comme ceci

$users = App\Book::with('author:id,name')->get();
10
répondu hendra1 2018-02-24 09:33:22

dans votre Post modèle:

public function userWithName()
{
    return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name'));
}

Maintenant vous pouvez utiliser $post->userWithName

9
répondu Duy Hoang 2016-11-08 09:44:39

notez que si vous n'avez besoin que d'une colonne de la table, alors utiliser 'listes' est très agréable. Dans mon cas, je récupère les articles favoris d'un utilisateur, mais je veux seulement les id d'article:

$favourites = $user->favourites->lists('id');

renvoie un tableau d'ids, par exemple:

Array
(
    [0] => 3
    [1] => 7
    [2] => 8
)
3
répondu omar j 2018-01-14 11:03:45

Maintenant vous pouvez utiliser la méthode pluck sur une Collection instance:

cette option renvoie uniquement l'attribut uuid de l'attribut Post model

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }
0
répondu Giovanni Far 2017-05-20 00:12:12