J'ai deux tables, User
et Post
. On User
peut en avoir plusieurs posts
et on post
n'appartient qu'à un seul user
.
Dans mon User
modèle, j'ai une hasMany
relation ...
public function post(){
return $this->hasmany('post');
}
Et dans mon post
modèle j'ai une belongsTo
relation ...
public function user(){
return $this->belongsTo('user');
}
Maintenant, je veux joindre ces deux tables en utilisant Eloquent with()
mais je veux des colonnes spécifiques de la deuxième table. Je sais que je peux utiliser le Générateur de requêtes, mais je ne veux pas.
Quand dans le 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, c'est ...
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Quand j'utilise ...
Post::with('user')->get(array('columns'....));
Il ne renvoie que la colonne de la première table. Je veux des colonnes spécifiques à with()
partir de la deuxième table. Comment puis je faire ça?
$query->select('id','username');
, jeTrying to get property of non-object
id
dans ce cas) est nécessaire dans le$query->select()
pour récupérer réellement les résultats nécessaires. J'ai omis cela dans mon code et je ne pouvais pas comprendre pourquoi il ne trouverait aucun résultat. Que je suis bête! J'espère que cela aide quelqu'un d'autre avec le même problèmeVous pouvez le faire comme ceci depuis Laravel 5.5:
Prenez soin du
id
terrain etforeign keys
comme indiqué dans la documentation :Par exemple, si l'utilisateur appartient à une équipe et a
team_id
comme colonne de clé étrangère, alors$post->user->team
est vide si vous ne spécifiez pasteam_id
la source
get()
méthodePost::with('user:id,username')->get(['age', 'color']);
Dans votre
Post
modèleLe crédit original va à Laravel Eager Loading - Charger uniquement des colonnes spécifiques
la source
$fields
paramètre.En allant dans l'autre sens (hasMany):
N'oubliez pas d'inclure la clé étrangère (en supposant qu'il s'agit de user_id dans cet exemple) pour résoudre la relation, sinon vous n'obtiendrez aucun résultat pour votre relation.
la source
Dans Laravel 5.7, vous pouvez appeler un champ spécifique comme celui-ci
Il est important d'ajouter un
foreign_key
champ dans la sélection.la source
Dans votre
Post
modèle:Vous pouvez maintenant utiliser
$post->userWithName
la source
Si vous souhaitez obtenir des colonnes spécifiques en utilisant
with()
dans laravel éloquent, vous pouvez utiliser le code ci-dessous auquel @Adam a répondu à l'origine dans sa réponse ici en réponse à cette même question:Donc je l'ai utilisé dans mon code mais cela me donnait une erreur de
1052: Column 'id' in field list is ambiguous
, donc si vous êtes également confronté au même problèmeEnsuite, pour le résoudre, vous devez spécifier le nom de la table avant la colonne id dans la
with()
méthode comme code ci-dessous :la source
Je suis tombé sur ce problème mais avec une deuxième couche d'objets connexes. La réponse de @Awais Qarni tient avec l'inclusion de la clé étrangère appropriée dans l'instruction select imbriquée. Tout comme un identifiant est requis dans la première instruction select imbriquée pour référencer le modèle associé, la clé étrangère est requise pour référencer le deuxième degré des modèles associés; dans cet exemple, le modèle d'entreprise.
De plus, si vous souhaitez sélectionner des colonnes spécifiques du modèle Post, vous devez inclure la colonne user_id dans l'instruction select afin de la référencer.
la source
Notez que si vous n'avez besoin que d'une seule colonne de la table, l'utilisation de «listes» est plutôt bien. Dans mon cas, je récupère les articles préférés d'un utilisateur mais je ne veux que les identifiants d'article:
Renvoie un tableau d'identifiants, par exemple:
la source
toArray()
!!!$user->favourites->lists('id')->toArray();
$user->favourites
sera renvoyéCollection
avec tous les champs sélectionnés. L'utilisation correcte est:$user->favourites()->lists('id')
.Query\Builder::lists
méthode etCollection::lists
méthode.Vous pouvez également spécifier des colonnes sur le modèle associé au moment d'y accéder.
Post::first()->user()->get(['columns....']);
la source
Vous pouvez maintenant utiliser la
pluck
méthode sur uneCollection
instance:Cela ne renverra que l'
uuid
attribut duPost model
la source
Essayez avec des conditions.
la source
la source