updateorcreate tutorial multitabla consultas consulta anidadas php laravel eloquent

php - multitabla - tutorial eloquent



Laravel Eloquent: Cómo obtener solo ciertas columnas de tablas unidas (15)

Para Laravel> = 5.2

Usa el método ->pluck()

$roles = DB::table(''roles'')->pluck(''title'');

Si desea recuperar una matriz que contiene los valores de una sola columna, puede usar el método de extracción

Para Laravel <= 5.1

Use el método ->lists()

$roles = DB::table(''roles'')->lists(''title'');

Este método devolverá una matriz de títulos de roles. También puede especificar una columna de clave personalizada para la matriz devuelta:

Tengo 2 tablas unidas en Eloquent, es decir, temas y usuarios.

modelo de tema:

public function user() { return $this->belongs_to(''User''); }

modelo de usuario:

public function themes() { return $this->has_many(''Theme''); }

Mi llamada aplo Eloquent se ve a continuación:

return Response::eloquent(Theme::with(''user'')->get());

Que devuelve todas las columnas del tema (está bien) y todas las columnas del usuario (no está bien). Solo necesito la columna ''nombre de usuario'' del modelo de usuario, ¿cómo puedo limitar la consulta a eso?


Así es como lo hago

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

La primera respuesta de user2317976 no funcionó, estoy usando laravel 5.1


Cambie su modelo para especificar qué columnas quiere seleccionar:

public function user() { return $this->belongs_to(''User'')->select(array(''id'', ''username'')); }

Y no olvides incluir la columna a la que te estás uniendo.


De esta manera:

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



En Laravel 5.5, la forma más limpia de hacerlo es:

Theme::with(''user:userid,name,address'')->get()

Agregue dos puntos y los campos que desea seleccionar separados por una coma y sin espacio entre ellos.


Lo sé, pides Eloquent pero puedes hacerlo con Fluent Query Builder

$data = DB::table(''themes'') ->join(''users'', ''users.id'', ''='', ''themes.user_id'') ->get(array(''themes.*'', ''users.username''));



Otra opción es hacer uso de la propiedad $hidden en el modelo para ocultar las columnas que no desea mostrar. Puede definir esta propiedad sobre la marcha o establecer valores predeterminados en su modelo.

public static $hidden = array(''password'');

Ahora la contraseña de los usuarios se ocultará cuando devuelva la respuesta JSON.

También puede configurarlo sobre la marcha de una manera similar.

User::$hidden = array(''password'');


Puede suministrar una matriz de campos en el parámetro get de esta manera:

return Response::eloquent(Theme::with(''user'')->get(array(''user.username''));

ACTUALIZACIÓN (para Laravel 5.2) De los docs , puede hacer esto:

$response = DB::table(''themes'') ->select(''themes.*'', ''users.username'') ->join(''users'', ''users.id'', ''='', ''themes.user_id'') ->get();


Sé que esta es una pregunta antigua, pero si está creando una API, como lo hace el autor de la pregunta, use transformadores de salida para realizar tales tareas.

Transofrmer es una capa entre el resultado de consulta de base de datos real y un controlador. Permite controlar y modificar fácilmente lo que se va a entregar a un usuario o consumidor de API.

Recomiendo Fractal como base sólida de la capa de transformación de salida. Puedes leer la documentación here .


Si entiendo bien esto, lo que se devuelve está bien, excepto que quiere ver solo una columna. Si es así, esto a continuación debería ser mucho más simple:

return Response::eloquent(Theme::with(''user'')->get([''username'']));


Usando con paginación

$data = DB::table(''themes'') ->join(''users'', ''users.id'', ''='', ''themes.user_id'') ->select(''themes.*'', ''users.username'') ->paginate(6);


user2317976 ha introducido una gran manera estática de seleccionar columnas de tablas relacionadas.

Este es un truco dinámico que he encontrado para que puedas obtener lo que quieras cuando uses el modelo:

return Response::eloquent(Theme::with(array(''user'' => function ($q) { $q->addSelect(array(''id'',''username'')) }))->get();

Acabo de descubrir que este truco también funciona bien con load () también. Esto es muy conveniente

$queriedTheme->load(array(''user''=>function($q){$q->addSelect(..)});

Asegúrese de incluir también la clave de la tabla de destino, de lo contrario no podrá encontrarla.


Usando el modelo:

Model::where(''column'',''value'')->get([''column1'',''column2'',''column3'',...]);

Usando Query Builder:

DB::table(''table_name'')->where(''column'',''value'')->get([''column1'',''column2'',''column3'',...]);