If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeTenemos 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.
... 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.
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)
.
... 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.
"Houston: no signs of life"
Start the conversation!
// composer.json
{
"require": {
"php": ">=8.1",
"ext-ctype": "*",
"ext-iconv": "*",
"beberlei/doctrineextensions": "^1.3", // v1.3.0
"doctrine/doctrine-bundle": "^2.7", // 2.9.1
"doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.2
"doctrine/orm": "^2.13", // 2.15.1
"symfony/asset": "6.2.*", // v6.2.7
"symfony/console": "6.2.*", // v6.2.10
"symfony/dotenv": "6.2.*", // v6.2.8
"symfony/flex": "^2", // v2.2.5
"symfony/framework-bundle": "6.2.*", // v6.2.10
"symfony/proxy-manager-bridge": "6.2.*", // v6.2.7
"symfony/runtime": "6.2.*", // v6.2.8
"symfony/twig-bundle": "6.2.*", // v6.2.7
"symfony/webpack-encore-bundle": "^1.16", // v1.16.1
"symfony/yaml": "6.2.*" // v6.2.10
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.4
"symfony/maker-bundle": "^1.47", // v1.48.0
"symfony/stopwatch": "6.2.*", // v6.2.7
"symfony/web-profiler-bundle": "6.2.*", // v6.2.10
"zenstruck/foundry": "^1.22" // v1.32.0
}
}