首页 > 解决方案 > PostgreSQL 上的教义:如果具有值数组的 jsonb 字段包含传递的值,如何选择一行

问题描述

我在 PostgreSQL 上。

我有一个 Doctrine 实体FruitEntity,其中包括两个字段:

apple如果我通过值,我想选择 ID = 的行banana

所以,这就是FruitRepository课程(我在 Symfony 上):

class FruitRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, FruitEntity::class);
    }

    public function myMethod(string $fruitName)
    {
        $result = $this->createQueryBuilder('f')
            ->select('f.id')
            ->andWhere('f.id = :fruitName')
            ->orWhere("JSON_EXTRACT(f.aliases, '$.:fruitName')")
            ->setParameter('fruitName', $fruitName)
            ->getQuery()
            ->getScalarResult();

        ...
    }
}

此代码生成此 DQL 查询:

SELECT f.id FROM App\Entity\FruitEntity f WHERE f.id = :fruitName OR JSON_EXTRACT(f.aliases, '$.:fruitName')

这显然是错误的,它产生的错误就是这个

注意:尝试访问 null 类型值的数组偏移量

如何选择 IDapple传递列orange中存在的值的aliases行?

标签: phppostgresqldoctrine-ormjsonb

解决方案


好的,最后我这样解决了:

        $result = $this->createQueryBuilder('f')
            ->select('f.id')
            ->andWhere('c.id = :fruitName')
            ->orWhere("JSONB_CONTAINS(f.aliases, '\"" . $fruitName . "\"') = true")
            ->setParameter('fruitName', $fruitName)
            ->getQuery()
            ->getScalarResult();

使用这些函数时,参数似乎没有被转换。

另请注意,我使用JSONB_CONTAINS而不是JSON_EXTRACT.

仅供参考,我显然用过scienta/doctrine-json-functions


推荐阅读