问题:Symfony Doctrine 查询生成器 LIKE 在 PostgreSQL 中不起作用

所以我有一个包含以下代码的 UserRepository

namespace AppBundle\Repository;
use \Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository
{
    public function findByRole($role)
    {
        $qb = $this->_em->createQueryBuilder();
        $qb->select('u')
            ->from($this->_entityName, 'u')
            ->where('u.roles LIKE :roles')
            ->setParameter('roles', '%"'.$role.'"%');

        return $qb->getQuery()->getResult();
    }
}

如果我的数据库是 MySQL,这似乎工作得很好,但是如果我将数据库更改为 PostgreSQL,则此查询会引发以下错误

执行 'SELECT p0_.id AS id_0, p0_.username AS username_1, p0_.password AS password_2, p0_.is_active AS is_active\ 时发生异常_3, p0_.roles AS 角色_4, p0_.name AS name_5, p0_.street AS street_6, p0_.city AS city_7, p0_.state AS state\ _8, p0_.zip_code AS zip_code_9, p0_.phone_number AS phone_number_10, p0_.dob AS dob_11, p0_.company_name AS company\ _name_12, p0_.company_slug AS company_slug_13, p0_.company_logo AS company_logo_14, p0_.company_details AS company_details_15, p0_。 stripe_customer_id AS stripe_customer_id_16, p0_.created_at AS created_at_17, p0_.updated_at AS updated_at_18 FROM px_user p0_ WHERE p0 _.roles 喜欢?带参数 ["%"ROLE_EMPLOYER"%"]:

SQLSTATE[42883]: 未定义函数: 7 错误: 运算符不存在: json ~~ 未知 LINE 1: ...at AS updated_at_18 FROM px_user p0_ WHERE p0_.roles LIKE $1 ^ 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

这是我第一次使用PostgreSQL,所以我没有得到问题所在。在玩了一段时间后,如果我通过添加以下内容将生成的查询更改为

WHERE 
  p0_.roles::text LIKE '%ROLE_EMPLOYER%'

一切正常。注意 ::text

那么现在我如何将它添加到 query builder 以便它也可以与 PostgreSQL 一起使用。

解答

我通过使用JsonbBundle解决了这个问题。

按照我采取的步骤修复它

$ composer require "boldtrn/jsonb-bundle

通过在相应位置添加以下内容更新了config.yml

doctrine:
    dbal:
        types:
          jsonb: Boldtrn\JsonbBundle\Types\JsonbArrayType
        mapping_types:
          jsonb: jsonb
    orm:
        dql:
            string_functions:
                JSONB_AG:   Boldtrn\JsonbBundle\Query\JsonbAtGreater
                JSONB_HGG:  Boldtrn\JsonbBundle\Query\JsonbHashGreaterGreater
                JSONB_EX:   Boldtrn\JsonbBundle\Query\JsonbExistence

roles属性更改为类型jsonb

在存储库中,以下查询有效

$query = $this->getEntityManager()->createQuery("SELECT u FROM AppBundle:User u WHERE JSONB_HGG(u.roles , '{}') LIKE '%EMPLOYER%' ");
$users = $query->getResult();
return $users;

功劳归于Doctrine query postgres json (contains) json_array

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐