Symfony2 LOWER DQL函数和字符不在保留表中错误



我正在使用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;

最新更新