Ho due tabelle User
e Post
One User
hanno molti posts
e un post
appartiene a un solo user
.
Nel mio model User
ho avuto hasMany
relazione simile
public function post(){ return $this->hasmany('post'); }
E nel mio model di post
ho una relazione come
public function user(){ return $this->belongsTo('user'); }
Ora voglio unirmi a queste due tabelle usando Eloquent with()
ma voglio colonne specifiche dalla seconda tabella. So che posso usare query Builder
ma non lo uso. Quando in post
model scrivo
public function getAllPosts() { return Post::with('user')->get(); }
Funziona seguendo le code
select * from `posts` select * from `users` where `users`.`id` in (<1>, <2>)
Ma io voglio
select * from `posts` select id,username from `users` where `users`.`id` in (<1>, <2>)
Quando lo uso
Post::with('user')->get(arrays('columns'....));
Restituisce solo la colonna dalla prima tabella. Voglio colonne specifiche usando with()
dalla seconda tabella. Come lo posso fare?
Bene, ho trovato la soluzione. Lo si può fare passando una function di closure
in with()
come secondo indice dell'arrays
Post::with(arrays('user'=>function($query){ $query->select('id','username'); }))->get();
Selezionerà solo id
e username
dall'altra tabella. Spero che questo aiuti gli altri.
Ricorda che la chiave primaria (id in questo caso) è necessaria in $ query-> select () per recuperare effettivamente i risultati necessari.
Nel tuo model Post
public function user() { return $this->belongsTo('User')->select(arrays('id', 'username')); }
Il credito originale va a Laravel Eager Loading – Carica solo colonne specifiche
Quando vai dall'altra parte (hasMany):
User::with(arrays('post'=>function($query){ $query->select('id','user_id'); }))->get();
Non dimenticare di includere la chiave esterna (supponendo che sia user_id in questo esempio) per risolvere la relazione, altrimenti otterrai zero risultati per la tua relazione.
Nel tuo model Post
:
public function userWithName() { return $this->belongsTo('User')->select(arrays('id', 'first_name', 'last_name')); }
Ora puoi usare $post->userWithName
Nota che se hai bisogno solo di una colonna dalla tabella, allora usare 'liste' è abbastanza carino. Nel mio caso sto recuperando gli articoli preferiti di un utente, ma voglio solo l'id dell'articolo:
$favourites = $user->favourites->lists('id');
Restituisce una matrix di ID, ad esempio:
Array ([0] => 3 [1] => 7 [2] => 8)
Puoi farlo in questo modo in Laravel 5.5:
Post::with('user:id,username')->get();
Prenditi cura del field id
come indicato nei documenti :
Quando si utilizza questa function, è necessario includere sempre la colonna id nell'elenco delle colonne che si desidera recuperare.
Ora puoi usare il metodo di pluck
su un'istanza di Collection
:
Ciò restituirà solo l'attributo uuid
del Post model
App\Models\User::find(2)->posts->pluck('uuid') => Illuminate\Support\Collection {#983 all: [ "1", "2", "3", ], }