Я пытаюсь понять, как в приложении 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
Большое спасибо.

Вы можете использовать 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, в данном случае с двойные кавычки.
Рекомендации:
Историческая справка: по состоянию на 01/2019 пакет был переименован в
scienta/doctrine-json-functions, а пространство имен было изменено. Раньше называлсяsyslogic/doctrine-json-functions.