Obtenga columnas específicas usando la función "With()" en Laravel Eloquent

Resuelto Awais Qarni asked hace 54 años • 22 respuestas

Tengo dos mesas Usery Post. Uno Userpuede tener muchos postsy postpertenecer a uno solo user.

En mi Usermodelo tengo una hasManyrelación...

public function post(){
    return $this->hasmany('post');
}

Y en mi postmodelo tengo una belongsTorelació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 Postmodelo 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?

Awais Qarni avatar Jan 01 '70 08:01 Awais Qarni
Aceptado

Bueno encontré la solución. Se puede hacer pasando una closurefunción with()como segundo índice de una matriz como

Post::query()
    ->with(['user' => function ($query) {
        $query->select('id', 'username');
    }])
    ->get()

Solo seleccionará idy usernamede 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.*

Awais Qarni avatar Nov 12 '2013 05:11 Awais Qarni

Puedes hacerlo así desde Laravel 5.5:

Post::with('user:id,username')->get();

Cuide el idcampo y foreign keyscomo 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_idcolumna de clave externa, entonces $post->user->teamestá 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_iden la userstabla), entonces debes especificarlo de esta manera:

Post::with('user:id,username,post_id')->get();

De lo contrario $post->userestará vacío.

Adam avatar Nov 11 '2017 13:11 Adam

Para cargar modelos con una columna específica, aunque no con carga inmediata, puede:

en tu Postmodelo

public function user()
{
    return $this->belongsTo('User')->select(['id', 'username']);
}

El crédito original es para Laravel Eager Loading: cargue solo columnas específicas

user1669496 avatar Nov 08 '2013 13:11 user1669496