Obtenga columnas específicas usando la función "With()" en Laravel Eloquent
Tengo dos mesas User
y Post
. Uno User
puede tener muchos posts
y post
pertenecer a uno solo user
.
En mi User
modelo tengo una hasMany
relación...
public function post(){
return $this->hasmany('post');
}
Y en mi post
modelo tengo una belongsTo
relación...
public function user(){
return $this->belongsTo('user');
}
Ahora quiero unir estas dos tablas usando Eloquent with()
pero quiero columnas específicas de la segunda tabla. Sé que puedo usar Query Builder pero no quiero.
Cuando en el Post
modelo escribo...
public function getAllPosts() {
return Post::with('user')->get();
}
Ejecuta las siguientes consultas...
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
Pero lo que quiero es...
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Cuando uso...
Post::with('user')->get(array('columns'....));
Sólo devuelve la columna de la primera tabla. Quiero utilizar columnas específicas with()
de la segunda tabla. ¿Cómo puedo hacer eso?
Bueno encontré la solución. Se puede hacer pasando una closure
función with()
como segundo índice de una matriz como
Post::query()
->with(['user' => function ($query) {
$query->select('id', 'username');
}])
->get()
Solo seleccionará id
y username
de otra tabla. Espero que esto ayude a otros.
Recuerde que la clave principal (id en este caso) debe ser el primer parámetro para
$query->select()
recuperar los resultados necesarios.*
Puedes hacerlo así desde Laravel 5.5:
Post::with('user:id,username')->get();
Cuide el id
campo y foreign keys
como se indica en los documentos :
Al utilizar esta función, siempre debe incluir la columna de identificación y cualquier columna de clave externa relevante en la lista de columnas que desea recuperar.
Por ejemplo, si el usuario pertenece a un equipo y tiene una team_id
columna de clave externa, entonces $post->user->team
está vacía si no se especifica team_id
Post::with('user:id,username,team_id')->get();
Además, si el usuario pertenece a la publicación (es decir, hay una columna post_id
en la users
tabla), entonces debes especificarlo de esta manera:
Post::with('user:id,username,post_id')->get();
De lo contrario $post->user
estará vacío.
Para cargar modelos con una columna específica, aunque no con carga inmediata, puede:
en tu Post
modelo
public function user()
{
return $this->belongsTo('User')->select(['id', 'username']);
}
El crédito original es para Laravel Eager Loading: cargue solo columnas específicas