Запрос ключа / значения в поле типа JSON с помощью Doctrine2

Я пытаюсь понять, как в приложении Symfony 3.4 получить (с помощью метода репозитория, например, с помощью запроса DQL) сущности в зависимости от значения для определенного ключа в столбце с типом "json". Увидел, что с postgre можно кое-что, но с mariaDB ничего не нашел.

Допустим, у меня есть сущность Письмо

с этим свойством:

/**
 *
 * @ORM\Column(type = "json")
 */
private $metadatas;

который содержит, например:

 {
    "key1": "value",
    "key2": "value"
 }

Как я могу или можно ли запросить у моей БД письма с определенным значением для определенного ключа в столбце метаданных.

Что-то вроде того :

public function getByKeyValue($key, $value)
      {
          $em = $this->_em;
          $dql = "SELECT l FROM AppBundle:Letter l
                  WHERE l.metadatas->:key = :value
                  ";

          $query = $em->createQuery($dql);
          $query->setParameter('key', $key);
          $query->setParameter('value', $value);


          return $query->getResult();
      } 

некоторая информация:

php7.1, mariadb 10.2+, doctrine/dbal ^2.6, doctrine orm ^2.5

Большое спасибо.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
8
0
10 296
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать ScientaNL / DoctrineJsonFunctions

Установите его через композитор, добавив:

"scienta/doctrine-json-functions": "~4.0",

Зарегистрируйте функцию json, которая необходима в конфигурации доктрины, в данном случае JSON_CONTAINS:

doctrine:
    orm:
        entity_managers:
            some_em: # usually also "default"
                dql:
                    string_functions:
                        JSON_CONTAINS: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonContains

В моем случае я просто добавил:

doctrine:
    orm:
         dql:
              string_functions:
                  JSON_CONTAINS: Scienta\DoctrineJsonFunctions\Query\AST\Functions\Mysql\JsonContains

Используй это:

$queryBuilder = $this->getDoctrine()->getRepository('AppBundle:Letter')->createQueryBuilder('lt');
$queryBuilder
        ->where("JSON_CONTAINS(lt.metadatas, :mvalue, '$.key') = 1");

$queryBuilder->setParameter('mvalue', '"value"');
$query = $queryBuilder->getQuery();
return $query->getResult();

В dql это должно быть примерно так:

$dql = "SELECT l FROM AppBundle:Letter l
              WHERE JSON_CONTAINS(lt.metadatas, :mvalue, '$.key') = 1
              ";

Примечание. $ .key - это ключ json для фильтрации, и значение mvalue должно быть включено в его кодированный формат json, в данном случае с двойные кавычки.

Рекомендации:

MySql json-поисковые функции

Историческая справка: по состоянию на 01/2019 пакет был переименован в scienta/doctrine-json-functions, а пространство имен было изменено. Раньше назывался syslogic/doctrine-json-functions.

romaricdrigon 31.01.2019 10:27

Другие вопросы по теме