php laravel laravel-5 eloquent laravel-5.2

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 .