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",
],
}