🔎 Búsquedas avanzadas en bases de datos

🔎 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.

Publicar un comentario

0 Comentarios