php - updateorcreate - Obtenga columnas específicas usando la función "con()" en Laravel Eloquent
updateorcreate laravel (8)
Tengo dos tablas. El User
y el Post
One User
tienen muchas posts
y una post
pertenece a un solo user
.
En mi Modelo de User
tengo hasMany
relación como
public function post(){
return $this->hasmany(''post'');
}
Y en mi modelo de post
, tengo relación con belongsTo
como
public function user(){
return $this->belongsTo(''user'');
}
Ahora quiero unirme a estas dos tablas usando Eloquent with()
pero quiero columnas específicas de la segunda tabla. Sé que puedo usar el query Builder
pero no quiero usar eso. Cuando en el modelo post
escribo
public function getAllPosts() {
return Post::with(''user'')->get();
}
Se ejecuta siguiendo queires
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
Pero yo quiero
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Cuando uso
Post::with(''user'')->get(array(''columns''....));
Solo devuelve la columna de la primera tabla. Quiero columnas específicas usando with()
de la segunda tabla. ¿Cómo puedo hacer eso?
Ahora puede usar el método de pluck
en una instancia de Collection
:
Esto devolverá solo el atributo uuid
del Post model
App/Models/User::find(2)->posts->pluck(''uuid'')
=> Illuminate/Support/Collection {#983
all: [
"1",
"2",
"3",
],
}
Bueno, encontré la solución. Se puede hacer uno pasando una función de closure
with()
como segundo índice de matriz como
Post::with(array(''user''=>function($query){
$query->select(''id'',''username'');
}))->get();
Solo seleccionará el id
y el username
de username
de otra tabla. Espero que esto ayude a otros.
Recuerde que la clave principal (id en este caso) es necesaria en $ query-> select () para recuperar realmente los resultados necesarios.
Cuando va por el otro camino (hasMany):
User::with(array(''post''=>function($query){
$query->select(''id'',''user_id'');
}))->get();
No olvide incluir la clave externa (suponiendo que sea user_id en este ejemplo) para resolver la relación, de lo contrario obtendrá cero resultados para su relación.
En Laravel 5.6 puedes llamar a un campo específico como este
$users = App/Book::with(''author:id,name'')->get();
En su modelo de Post
:
public function userWithName()
{
return $this->belongsTo(''User'')->select(array(''id'', ''first_name'', ''last_name''));
}
Ahora puedes usar $post->userWithName
En tu modelo de Post
public function user()
{
return $this->belongsTo(''User'')->select(array(''id'', ''username''));
}
El crédito original es para Laravel Eager Loading - Cargue únicamente columnas específicas
Puedes hacerlo así en Laravel 5.5:
Post::with(''user:id,username'')->get();
Cuide el campo de id
como se indica en los docs :
Al utilizar esta función, siempre debe incluir la columna de identificación en la lista de columnas que desea recuperar.
Tenga en cuenta que si solo necesita una columna de la tabla, usar ''listas'' es bastante agradable. En mi caso, estoy recuperando los artículos favoritos de un usuario, pero solo quiero los ID del artículo:
$favourites = $user->favourites->lists(''id'');
Devuelve una matriz de identificadores, por ejemplo:
Array
(
[0] => 3
[1] => 7
[2] => 8
)