Symfony Doctrine 查询生成器 LIKE 在 PostgreSQL 中不起作用
问题:Symfony Doctrine 查询生成器 LIKE 在 PostgreSQL 中不起作用 所以我有一个包含以下代码的 UserRepository namespace AppBundle\Repository; use \Doctrine\ORM\EntityRepository; class UserRepository extends EntityRepository { publi
问题: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
更多推荐
所有评论(0)