我正在使用Symfony 2.3和PostgreSQL 9.2。我只想根据一个复选框的值执行两个简单的查询。这样的查询是:
1) SELECT * FROM table WHERE field LIKE 'Something'
2) SELECT * FROM table WHERE field ILIKE 'Something'
如您所知,第一个是区分大小写的,第二个是不区分大小写的。我知道在Doctrine中不存在ililike,我应该使用LOWER函数。但是,如果在查询中指定一些特殊字符(例如'è'),则在使用不区分大小写的版本(即使用LOWER函数时)时会得到错误。
特别是,我得到的错误如下:
SQLSTATE[22021]: Character not in repertoire: 7 ERROR: invalid byte sequence for encoding "UTF8": 0xe3 0xa8 0x20
当我不使用LOWER函数时,一切都很好。我已经检查了编码,它是UTF8的数据库和PostgreSQL的client_encoding参数。
任何建议吗?谢谢你
这是谷歌的第一个结果,但是没有答案。
答:如果你在网站上使用UTF-8编码(或其他多字节编码),你必须使用带'mb'的PHP函数来处理文本。
我有这个问题:
$qb = $this->createQueryBuilder('cf');
$qb->select(['cf'])
->where($qb->expr()->orX(
'LOWER(cf.name) LIKE :searchName',
'LOWER(cf.address) LIKE :searchName',
'LOWER(cf.city) LIKE :searchName',
'LOWER(cf.zipCode) LIKE :searchName'
));
$qb->setParameter('searchName', '%' . strtolower($searchName) . '%');
您只需将strtolower替换为mb_strtolower
For Symfony 4^
正如在另一个答案中提到的,您可以使用doctrine的expr()方法替换该功能,并模拟"iLIKE"PostgreSQL函数如下:
// inside your method in your repository class
$this
->createQueryBuilder('doctor')
->add('where', $this->expr()->orX(
$this->expr()->like($this->expr()->lower('doctor.firstName'), ':complete_name'),
$this->expr()->like($this->expr()->lower('doctor.lastName'), ':complete_name')
))
->setParameter('complete_name', "%$complete_name_criteria%");
不要忘记添加这个use语句(但是你会得到一个意想不到的错误…):
use DoctrineORMQueryExprJoin;