En este pequeño articulo, vamos a revisar un concepto básico de como una búsqueda «anidada» utilizando las relaciones de Eloquent, el ORM que nos provee Laravel para interactuar con nuestra Base de Datos.
Caso de Uso
Definiendo las Relaciones
Según el caso de uso anterior, sabemos que un vuelo (Flight) pertenece a un usuario (User), por lo cual declaramos la relación que vamos a utilizar dentro del modelo Flight
1 2 3 4 | public function user() { return $this->belongsTo(User::class); } |
De esta manera, podremos realizar una consulta en el modelo de User a través del modelo de Flight. Si aun no has visto esto, te recomiendo que pases por la documentación para entender un poco como funcionan las relaciones de Eloquent.
Realizando la Consulta
Ahora vamos a nuestro controlador FlightController para este ejemplo, en el cual tendré un método index que recibe a través de una petición el username a ser buscado.
1 2 3 4 5 6 7 8 | public function index(Request $request) { $flight = Flight::whereHas('user', function ($query) use ($request) { $query->where('username', 'like', "%{$request->username}%"); })->get(); return view('flights.index', compact('flight')); } |
¿Que estamos haciendo? En el ejemplo anterior estamos buscando todos los vuelos donde el usuario sea similar al que recibo a través de la petición. Al método whereHas le pasamos la relación como el primer parámetro y luego pasamos la condición como la segunda usando una función anónima para ello. De esta manera, Eloquent nos provee una sintaxis bastante limpia para realizar este tipo de consultas.
También disponemos de los métodos orWhereHas, whereDoesntHave dentro de los modelos, los cuales se utilizan de manera similar.