使用Doctrine2请求JSON类型字段中的键/值

时间:2018-03-14 14:09:30

标签: json symfony doctrine mariadb dql

我试图弄清楚如何在symfony 3.4应用程序中检索(通过存储库方法,例如使用DQL请求)实体,具体取决于“json”类型列中特定键的值。看到有一些东西可能与postgre但我没有找到任何与mariaDB

假设我得到一个实体 Letter

使用此属性:

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

其中包含,例如:

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

我怎样才能,或者,是否可以请求我的数据库为metadatas列中的特定键获取具有特定值的字母。

类似的东西:

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

非常感谢。

1 个答案:

答案 0 :(得分:7)

您可以使用ScientaNL/DoctrineJsonFunctions

通过添加:

通过composer安装它
"scienta/doctrine-json-functions": "~4.0",

注册doctrine配置中需要的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-search-functions