php - ¿Cómo obtener datos relegados de la segunda tabla en Laravel?
laravel-5 eloquent (2)
Tengo dos tablas: users
y students
. Estas tablas están conectadas por campos:
users.id = studetns.user_id
Intento obtener información usando la solicitud:
$students = User::where(function ($query) use ($request) {
// Filter by name
if (($term = $request->get("name"))) {
$query->where(''name'', ''like'', ''%'' . $term . ''%'');
$query->where(''secondname'', ''like'', ''%'' . $term . ''%'');
}
})->with("details")->where(''type'', ''2'')->orderBy(''name'', ''desc'')->get();
dd($students);
Puede ver with("details")
, que debe para conectar tablas.
Mi modelo de User
es:
public function details()
{
return $this->hasOne(''App/Student'', ''user_id'', ''id'');
}
Cuando ejecuto la consulta obtengo un error:
select * from `users` where `type` = 2 order by `name` desc)
Significa que no se ha conectado con la segunda tabla donde hay campos de name
.
La forma de cargar los modelos de usuario , filtrando por nombre en la devolución de llamada pasada a donde () , causa el error, porque no hay una columna de nombre en la tabla de usuarios , por lo que simplemente no puede funcionar.
Si desea cargar usuarios que hayan dado nombre en la tabla de estudiantes relacionados, debe usar whereHas () :
$students = User::whereHas(''details'', function ($query) use ($request) { // Filter by name
if (($term = $request->get("name"))) {
$query->where(''name'', ''like'', ''%'' . $term . ''%'');
$query->where(''secondname'', ''like'', ''%'' . $term . ''%'');
}
})
->join(''details'', ''details.user_id'', ''='', ''users.id'')
->with("details")
->where(''type'', ''2'')
->orderBy(''name'', ''desc'')
->get();
También creo que es posible que desee obtener usuarios cuyo nombre O segundo nombre coincida con el término $ , por lo que le sugiero que reemplace:
$query->where(''name'', ''like'', ''%'' . $term . ''%'');
$query->where(''secondname'', ''like'', ''%'' . $term . ''%'');
con
$query->where(''name'', ''like'', ''%'' . $term . ''%'');
$query->orWhere(''secondname'', ''like'', ''%'' . $term . ''%'');
Si el name
y el secondname
name
están en la tabla de students
, intente esto:
$students = User::where(''type'', ''2'')
->with([''details'' => function ($query) use ($request) {
if (!empty($request->name)) {
$query->where(''name'', ''like'', ''%''.$request->name.''%'');
$query->orWhere(''secondname'', ''like'', ''%''.$request->name.''%'');
}
$query->orderBy(''name'', ''desc'');
}])->get();
Esto cargará y ordenará a todos los students
(o, si existe $request->name
variable de $request->name
, todos los students
filtrarán por su valor).
PD: Como dijo @ jedrzej.kurylo, tiene sentido usar el operador orWhere
si quiere encontrar el nombre en la columna de name
o en el secondname
.