Buy Access to Course
14.

DONDE EN()

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

Tenemos categorías para "Mascotas" y "Amor", pero si buscamos aquí arriba "mascotas amor"... ¡no hay resultados! Eso tiene sentido. Estamos buscando si esta cadena coincide conname o con iconKey. Hagamos nuestra búsqueda más inteligente para ver si podemos coincidir con ambas categorías buscando palabra por palabra.

La consulta para esto vive en CategoryRepository... en el método search(). El argumento$term es la cadena que escribimos. Aquí abajo, digamos que$termList = luego explode esa cadena en una matriz dividiéndola en espacios vacíos. Si quieres una búsqueda realmente rica, deberías utilizar un sistema de búsqueda real. Pero podemos hacer cosas bastante chulas sólo con la base de datos.

119 lines | src/Repository/CategoryRepository.php
// ... lines 1 - 18
class CategoryRepository extends ServiceEntityRepository
{
// ... lines 21 - 41
public function search(string $term): array
{
$termList = explode(' ', $term);
// ... lines 45 - 51
}
// ... lines 53 - 117
}

Éste es el objetivo: quiero que también coincidan los resultados en los que category.name esté en una de las palabras de la matriz.

Utilizando la IN

Justo después de category.name LIKE :searchTerm, añade OR category.name IN. Lo único complicado de esto es la sintaxis. Añade (). Si estuviéramos escribiendo una consulta SQL sin formato, escribiríamos aquí una lista, como 'foo', 'bar'. Pero con el constructor de consultas, en lugar de eso, pon un marcador de posición, como :termList. A continuación pásalo:->setParameter('termList', $termList).

120 lines | src/Repository/CategoryRepository.php
// ... lines 1 - 41
public function search(string $term): array
{
// ... lines 44 - 46
return $this->addFortuneCookieJoinAndSelect($qb)
->andWhere('category.name LIKE :searchTerm OR category.name IN (:termList) OR category.iconKey LIKE :searchTerm OR fortuneCookie.fortune LIKE :searchTerm')
// ... line 49
->setParameter('termList', $termList)
// ... lines 51 - 52
}
// ... lines 54 - 120

La clave es que, cuando utilices IN, necesitarás los paréntesis como siempre... pero dentro de eso, en lugar de una lista separada por comas, pondrás un array. Doctrine transformará eso por nosotros.

Y ahora... ¡bien! Una vez que sabes cómo funciona, es así de fácil.

Lo siguiente: Probablemente estés familiarizado con la función RAND() para MySQL, o quizá con la funciónYEAR()... o con alguna de las muchas funciones MySQL o PostgreSQL que existen. Pues bien, quizá te sorprenda saber que algunas de ellas no funcionan de forma inmediata.