Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

El QueryBuilder

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

Es realmente poderoso comprender que DQL es, en última instancia, lo que se utiliza entre bastidores en Doctrine. Pero la mayoría de las veces, no vamos a construir esta cadena DQL a mano. No, vamos a utilizar algo llamado "QueryBuilder". Ooooh.

Crear el QueryBuilder

Comenta el DQL. Vamos a reconstruirlo con el QueryBuilder. Empieza con $qb(por "QueryBuilder") = $this->createQueryBuilder(). Dentro, di category.

... lines 1 - 17
class CategoryRepository extends ServiceEntityRepository
{
... lines 20 - 27
public function findAllOrdered(): array
{
... line 30
$qb = $this->createQueryBuilder('category')
... lines 32 - 35
}
... lines 37 - 79
}

Como estamos dentro de CategoryRepository, cuando decimos createQueryBuilder(), eso añade automáticamente FROM App\Entity\Category y lo aliasa a category, ya que eso es lo que pasamos como argumento. Esto también selecciona todo por defecto. Así que... ¡con sólo esto, ya hemos recreado la mayor parte de esta consulta!

Para añadir el siguiente punto, puedes encadenar esto: ->addOrderBy() concategory.name. Luego usaré esta clase Criteria ( pulsa "tab" para autocompletarlo) seguida de DESC. O puedes poner simplemente la cadena 'DESC': es lo mismo.

... lines 1 - 27
public function findAllOrdered(): array
{
... line 30
$qb = $this->createQueryBuilder('category')
->addOrderBy('category.name', Criteria::DESC);
... lines 33 - 35
}
... lines 37 - 81

Ejecutar el QueryBuilder

¡QueryBuilder listo! Para ejecutarlo, seguimos necesitando ese objeto Query. Ahora podemos obtenerlo con $qb->getQuery(). Internamente, esto debería generar exactamente el mismo DQL que antes, ¡y puedo probarlo! Añade un dd() con $query y, en lugar de decir ->getSQL(), di ->getDQL().

... lines 1 - 27
public function findAllOrdered(): array
{
... lines 30 - 32
$query = $qb->getQuery();
dd($query->getDQL());
... lines 35 - 36
}
... lines 38 - 82

Cuando probemos eso... ¡sí! ¡Es exactamente lo que escribimos antes! Así que, sin sorpresas, si eliminamos ese dd() y actualizamos... ¡volvemos a funcionar! Así de fácil.

... lines 1 - 27
public function findAllOrdered(): array
{
... line 30
$qb = $this->createQueryBuilder('category')
->addOrderBy('category.name', Criteria::DESC);
$query = $qb->getQuery();
return $query->getResult();
}
... lines 37 - 81

Vale, ya tenemos lo básico del QueryBuilder. Pongámonos más complejos añadiendo a continuaciónandWhere() y orWhere().

Leave a comment!

0
Login or Register to join the conversation
Cat in space

"Houston: no signs of life"
Start the conversation!

What PHP libraries does this tutorial use?

// 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
    }
}
userVoice