🔎 Búsquedas avanzadas en bases de datos
Potencia tus consultas con cláusulas "where" y más
Para construir aplicaciones robustas, a menudo necesitamos realizar búsquedas que van más allá de una simple coincidencia. Laravel, con su constructor de consultas y el ORM **Eloquent**, nos facilita la creación de consultas complejas de manera legible y segura, utilizando cláusulas como **`where`**, **`orWhere`**, y las búsquedas con **`LIKE`**.
🔍 Búsqueda parcial con LIKE
Para encontrar registros donde un campo contenga un término específico (búsqueda parcial), utilizamos la cláusula **`where`** junto con el operador **`LIKE`** y el comodín **`%`**.
app/Http/Controllers/SearchController.php
public function search(Request $request) { $searchTerm = $request->input('q'); $results = Product::where('name', 'LIKE', '%' . $searchTerm . '%') ->orWhere('description', 'LIKE', '%' . $searchTerm . '%') ->get(); return view('search.results', compact('results', 'searchTerm')); }
El uso de **`orWhere`** nos permite buscar el término en múltiples campos.
🚦 Cláusulas OR y anidamiento de condiciones
Cuando necesitamos agrupar condiciones, como **(A AND B) OR C**, Laravel nos permite anidar las condiciones **`where`** pasando una *clausura* (función anónima) como segundo argumento.
Ejemplo de consulta anidada
$products = Product::where('status', 'active')
->where(function ($query) {
$query->where('price', '>', 500)
->orWhere('stock', '>', 100);
})
->get();
**Explicación:** Esta consulta busca productos que están **activos** y que tienen un **precio superior a 500** *o* un **stock superior a 100**.
🔗 Búsquedas por relación (Where Has)
Uno de los requerimientos más comunes es buscar un modelo basándose en la existencia o en las propiedades de una relación. Laravel nos ofrece el método **`whereHas()`**.
Buscando usuarios con posts activos
$users = User::whereHas('posts', function ($query) {
$query->where('is_published', true);
})->get();
Esto recupera a todos los **Usuarios** que tienen al menos un **Post** que está marcado como publicado (donde `is_published` es `true`).
✅ Buenas prácticas
- Utiliza el **constructor de consultas** o **Eloquent** para prevenir ataques de inyección SQL.
- Para búsquedas con `LIKE`, utiliza siempre *bindings* o la sintaxis de Eloquent para sanitizar la entrada.
- Considera utilizar **Scout** con un motor como **MeiliSearch** o **Algolia** para búsquedas a gran escala, ya que son mucho más rápidos que las búsquedas directas en la base de datos con `LIKE`.
- Indexa las columnas que utilizas frecuentemente en tus cláusulas `where` y `order by` para mejorar el rendimiento.
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias