【问题标题】:Request on key/value in a JSON type field with Doctrine2使用 Doctrine2 请求 JSON 类型字段中的键/值
【发布时间】:2018-03-14 14:09:29
【问题描述】:

我试图弄清楚如何在 symfony 3.4 应用程序中根据“json”类型列中特定键的值来检索(通过存储库方法,例如使用 DQL 请求)实体。看到 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+、教义/dbal ^2.6、教义 orm ^2.5

非常感谢。

【问题讨论】:

    标签: json symfony doctrine mariadb dql


    【解决方案1】:

    您可以使用ScientaNL/DoctrineJsonFunctions

    通过composer安装:

    "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-search-functions

    【讨论】:

    • 历史记录,截至 01/2019 包已重命名为 scienta/doctrine-json-functions,并且命名空间已更改。在它被称为syslogic/doctrine-json-functions之前。
    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多