【发布时间】:2017-05-06 22:56:34
【问题描述】:
所以我有一个包含以下代码的 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 roles_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 LIKE ?带参数 ["%\"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。
那么现在我如何将它添加到 查询构建器 以便它也适用于 PostgreSQL。
【问题讨论】:
-
使用->setParameter('roles', '"%'.$role.'%"');
-
@JasminMistry 我也试过了,但出现了同样的错误。
-
->where('CAST(u.roles AS TEXT) LIKE :roles')应该可以工作。您的roles是json类型的列,因此不能直接用于代替字符串类型(引擎需要字符串类型(例如text)-LIKE运算符(也是~~) 就是这样)。 -
@pozs 感谢分享信息,我不知道。进行更改后,我看到 [Syntax Error] line 0, col 44: Error: Expected known function, got 'CAST'
-
@Baig 然后看起来 Doctrine 解析了你给
where()的内容并且也不允许一些非常基本的 SQL。 It's not even supported in DQL。在最坏的情况下,您可以使用本机查询。
标签: php postgresql symfony doctrine-orm