Comment sélectionner en fonction des champs de la colonne JSON à l'aide du générateur de requêtes Doctrine
P粉423694341
P粉423694341 2024-01-06 16:58:30
0
1
546

J'ai une table avec une colonne JSON de type longtext (DC2Type:json). La table a une entité dans l'ORM Doctrine de mon projet Symfony. Je souhaite effectuer une requête basée sur un champ dans une colonne JSON à l'aide du générateur de requêtes Doctrine dans la variable $qb

Que dois-je faire ? Tout ce que j'ai trouvé en ligne indique d'installer un package tiers pour activer cette fonctionnalité. Existe-t-il un moyen de le faire en utilisant uniquement le générateur de requêtes de Doctrine sans installer un autre package ?

Une solution (peut-être stupide) que j'ai essayée était de traiter la colonne comme une chaîne et...

$qb->andWhere("my_data LIKE "%id:\"1,%"");

Par exemple, si je souhaite interroger la colonne JSON my_data 以查找字符串中包含 id":1, pour un blob. Cela échoue avec une erreur de syntaxe très étrange et ce n'est de toute façon pas la bonne façon d'interroger les champs JSON. Cependant, l'exécution de la requête LIKE directement dans le client SQL fonctionne comme je le souhaite, donc je ne sais pas non plus pourquoi cela échoue dans Doctrine.

EDIT : Il s'agit de MySQL/MariaDB.

P粉423694341
P粉423694341

répondre à tous(1)
P粉724737511

Le langage de requête Doctrine est très limité. Il ne couvre que les fonctions SQL les plus basiques/communes, ce qui est suffisant pour 99 % des cas d'utilisation, mais pas tous.

Si votre version de MariaDB prend en charge nativement JSON (par exemple 10.2 ou supérieur), vous pouvez utiliser des fonctions natives pour traiter les données JSON. (Si ce n'est pas le cas, votre solution de contournement est la seule option et peut nécessiter un filtrage supplémentaire dans l'application).

Pour pouvoir utiliser ces fonctions en DQL, vous devez les définir vous-même ou bien utiliser une bibliothèque tierce telle que scienta/doctrine-json-functions (à noter qu'il existe une documentation sur la façon de l'utiliser avec Symfony, Et c'est très simple).

Si vous n'avez besoin que d'une seule fonction supplémentaire et que vous n'avez pas besoin de l'ensemble du package pour une raison quelconque, vous pouvez copier cette seule classe et l'utiliser comme la vôtre.

Alternativement, vous pouvez abandonner DQL et écrire SQL directement, mais vous ne pourrez alors pas fusionner directement dans des objets et utiliser d'autres magies de la Doctrine pour traiter les données. Mais pour des cas d’utilisation simples, cela suffit.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal