简体   繁体   English

如何在没有本机查询的情况下使学说 findby 到 json 字段

[英]How make doctrine findby to json field without native query

I use json column in doctrine 2 (In MySQL database).我在doctrine 2使用json列(在MySQL数据库中)。 Actually, I made my search in json with native query like实际上,我使用本机查询在json进行了搜索,例如

$rsm = new ResultSetMappingBuilder($entityManager);
$rsm->addRootEntityFromClassMetadata(\blabla\MyObject::class, 'o');
$query = $entityManager->createNativeQuery('select o.* from my_objects o where json_extract(jsonData, "$.test.key1")= "value1"', $rsm); 
//jsonData column contains {"test": {"key1" : "value1"}}
$result = $query->getResult();

Is it possible the made query like that without the native query mechanism ?如果没有本机查询机制,是否有可能进行这样的查询? (like a findBy) (就像一个 findBy)

Thanks in advance for your help ;)在此先感谢您的帮助 ;)

I solved my problem using DQL extension scienta/doctrine-json-functions我使用 DQL 扩展scienta/doctrine-json-functions解决了我的问题

Install it安装它

composer req scienta/doctrine-json-functions

Usage用法

$queryBuilder = $entityManager->createQueryBuilder();
$query = $queryBuilder
    ->select("o")
    ->from(\bla\bla\MyObject::class, "o")
    ->where("JSON_EXTRACT(o.jsonData, :jsonPath) = :value ")
    ->setParameter('jsonPath', '$.test.key1')
    ->setParameter('value', 'value1')
    ->getQuery();

$co = $query->getResult();

I was just facing the same problem, but didn't want to install an additional extension.我只是面临同样的问题,但不想安装额外的扩展。 The code snippet from the original question just needs a small enhancement to work:原始问题中的代码片段只需要一个小的增强即可工作:

$rsm = $this->createResultSetMappingBuilder('n');
$rsm->addRootEntityFromClassMetadata(MyObject::class, 'n');
$rawQuery = sprintf('SELECT %s FROM my_objects n WHERE JSON_EXTRACT(current_state, \'$.processing\')', $rsm->generateSelectClause());
$query = $this->_em->createNativeQuery($rawQuery, $rsm);
return $query->getResult();

And it works like a charm.它就像一个魅力。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM