Tengo dos mesas Usery Post. Uno Userpuede tener muchos postsy uno postpertenece 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 el generador de consultas, pero no quiero hacerlo.
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'....));
Solo devuelve la columna de la primera tabla. Quiero columnas específicas usando with()de la segunda tabla. ¿Cómo puedo hacer eso?

$query->select('id','username');, estaba obteniendoTrying to get property of non-objectiden este caso) es necesaria$query->select()para recuperar los resultados necesarios. Omití esto en mi código y no pude entender por qué no encontraría ningún resultado. ¡Tonto de mí! Espero que esto ayude a cualquier otra persona con el mismo problemaPuedes hacerlo así desde Laravel 5.5:
Cuide el
idcampo yforeign keyscomo se indica en los documentos :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 especificateam_idfuente
get()métodoPost::with('user:id,username')->get(['age', 'color']);En su
PostmodeloEl crédito original va a Laravel Eager Loading: carga solo columnas específicas
fuente
$fieldsparámetro.Al ir hacia el otro lado (hasMany):
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.
fuente
En Laravel 5.7 puedes llamar a un campo específico como este
Es importante agregar un
foreign_keycampo en la selección.fuente
En su
Postmodelo:Ahora puedes usar
$post->userWithNamefuente
Si desea obtener columnas específicas usando
with()laravel elocuente, puede usar el código que se muestra a continuación, que originalmente fue respondido por @Adam en su respuesta aquí en respuesta a esta misma pregunta:Así que lo he usado en mi código pero me estaba dando un error
1052: Column 'id' in field list is ambiguous, así que si ustedes también enfrentan el mismo problemaLuego, para resolverlo, debe especificar el nombre de la tabla antes de la columna de identificación en el
with()método como se muestra a continuación :fuente
Encontré este problema pero con una segunda capa de objetos relacionados. La respuesta de @Awais Qarni se mantiene con la inclusión de la clave externa apropiada en la instrucción de selección anidada. Así como se requiere una identificación en la primera instrucción select anidada para hacer referencia al modelo relacionado, la clave externa se requiere para hacer referencia al segundo grado de modelos relacionados; en este ejemplo el modelo de empresa.
Además, si desea seleccionar columnas específicas del modelo de publicación, deberá incluir la columna user_id en la instrucción select para hacer referencia a ella.
fuente
Tenga en cuenta que si solo necesita una columna de la tabla, entonces usar 'listas' es bastante bueno. En mi caso, estoy recuperando los artículos favoritos de un usuario, pero solo quiero la identificación del artículo:
Devuelve una matriz de identificadores, por ejemplo:
fuente
toArray()!!!$user->favourites->lists('id')->toArray();$user->favouritesserá devueltoCollectioncon todos los campos seleccionados. El uso correcto es:$user->favourites()->lists('id').Query\Builder::listsmétodo yCollection::listsmétodo.También puede especificar columnas en el modelo relacionado al momento de acceder a él.
Post::first()->user()->get(['columns....']);fuente
Ahora puede usar el
pluckmétodo en unaCollectioninstancia:Esto devolverá solo el
uuidatributo dePost modelfuente
Probar con condiciones.
fuente
fuente