Langage de requête de doctrine : recherche du nombre maximum ou des dernières lignes par groupe
Dans certaines opérations de base de données, il est nécessaire d'interroger le nombre maximum ou le plus récent ligne au sein d’un groupe de données. Pour traduire les instructions SQL qui effectuent de telles opérations en Doctrine Query Language (DQL), vous devez exploiter des techniques spécifiques.
Une technique SQL courante consiste à utiliser une sous-requête pour déterminer la valeur la plus élevée ou la plus récente au sein d'un groupe, puis à la rejoindre. la requête principale avec ces résultats. Cependant, cette approche peut devenir complexe lorsqu'il s'agit de Doctrine.
Une solution alternative consiste à réécrire l'instruction SQL pour éviter d'utiliser des fonctions d'agrégation. Par exemple, pour trouver le score le plus élevé par nom, vous pouvez utiliser l'instruction SQL suivante :
SELECT a.* FROM score a LEFT JOIN score b ON a.name = b.name AND a.score < b.score WHERE b.score IS NULL ORDER BY a.score DESC
Cette requête sélectionne toutes les lignes de la table de scores où aucun score plus élevé n'est enregistré pour le même nom.
Pour traduire l'instruction SQL en DQL, vous pouvez écrire :
SELECT a FROM AppBundle\Entity\Score a LEFT JOIN AppBundle\Entity\Score b WITH a.name = b.name AND a.score < b.score WHERE b.score IS NULL ORDER BY a.score DESC
Vous pouvez également utiliser l'API du générateur de requêtes dans Doctrine pour construire la requête :
$DM = $this->get( 'Doctrine' )->getManager(); $repo = $DM->getRepository( 'AppBundle\Entity\Score' ); $results = $repo->createQueryBuilder( 'a' ) ->select( 'a' ) ->leftJoin( 'AppBundle\Entity\Score', 'b', 'WITH', 'a.name = b.name AND a.score < b.score' ) ->where( 'b.score IS NULL' ) ->orderBy( 'a.score','DESC' ) ->getQuery() ->getResult();
Cela fournit un moyen efficace d'effectuer la même opération que l'instruction SQL d'origine à l'aide de Doctrine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!