Ottieni colonne specifiche usando la function "with ()" in Laravel Eloquent

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