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?
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.
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
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.
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.
dans Laravel 5.6 vous pouvez appeler le champ spécifique comme ceci
$users = App\Book::with('author:id,name')->get();
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
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
)
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",
],
}