馃攷 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