Tengo dos mesas User
y Post
. Uno User
puede tener muchos posts
y uno post
pertenece 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 el generador de consultas, pero no quiero hacerlo.
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'....));
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-object
id
en 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
id
campo yforeign keys
como se indica en los documentos :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 especificateam_id
fuente
get()
métodoPost::with('user:id,username')->get(['age', 'color']);
En su
Post
modeloEl crédito original va a Laravel Eager Loading: carga solo columnas específicas
fuente
$fields
pará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_key
campo en la selección.fuente
En su
Post
modelo:Ahora puedes usar
$post->userWithName
fuente
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->favourites
será devueltoCollection
con todos los campos seleccionados. El uso correcto es:$user->favourites()->lists('id')
.Query\Builder::lists
método yCollection::lists
mé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
pluck
método en unaCollection
instancia:Esto devolverá solo el
uuid
atributo dePost model
fuente
Probar con condiciones.
fuente
fuente