当我在我的PostgreSQL数据库中执行它时,我有一个运行良好的查询,但是我无法使它在我的控制器中工作。
这是一个查询:
SELECT id, nume, prenume FROM cirrus.personal WHERE unaccent(nume) ILIKE '%bala%' OR unaccent(prenume) ILIKE '%bala%';
这个查询的特别之处在于,我使用了PostgreSQL数据库的PostgreSQL扩展,因为当我搜索一个必须对'a'和'ă'这样的特殊字符不敏感的人的名字时,我就需要它。
我现在在PersonalController.php中的查询如下:
$personalTemp = $this->Personal->find('all', ['fields' => ['id', 'nume', 'prenume']])
->where(['OR' => [['Personal.nume ilike' => "%" . $term . "%"],
['Personal.prenume ilike' => "%" . $term . "%"]]]);我尝试过多种方法在这个查询中放置unaccent(),比如将它添加到unaccent(Personal.nume)或"unaccent(%" . $term . "%)"中,但是这些方法的工作方式都与我试图完成的查询不同。
如有任何建议,将不胜感激。
编辑:
我已经设法在我的控制器中创建了所需的查询。看起来是这样的:
$personalTemp = $this->Personal->find('all', ['fields' => [
'id' => 'id',
'nume' => 'nume',
'prenume' => 'prenume'
]])
->where(['OR' => [
['public.unaccent(nume) ilike public.unaccent(\'%'. $term . '%\') '],
['public.unaccent(prenume) ilike public.unaccent(\'%'. $term . '%\') ']]]);`但是现在CakePhp在识别unaccent()函数时遇到了困难。有人能帮我吗?
发布于 2016-09-14 09:22:23
unaccent扩展似乎设置为public模式。尝试将其设置为模式:
ALTER EXTENSION unaccent
SET SCHEMA your_schema;集模式 此表单将扩展的对象移动到另一个架构中。
发布于 2016-09-13 09:30:39
尝尝这个
$this->Personal->find('all', array(
'fields' => array(
'Personal.id',
'Personal.nume',
'Personal.prenume'
),
'conditions' => array(
'OR' => array(
'unaccent(nume) LIKE \'%bala%\''
'unaccent(nume) LIKE \'%bala%\''
)
)
))发布于 2018-03-09 14:29:03
根据文档,您需要使用bind来避免sql注入的问题。
https://book.cakephp.org/3.0/en/orm/query-builder.html#binding-values
尝尝这个
$orWhere = [
"unaccent(nume) ilike '%'||unaccent(:search)||'%' ",
"unaccent(prenume) ilike '%'||unaccent(:search)||'%' ",
];
$qry->bind(':search', $search, 'string');
$qry->where(['OR' => $orWhere]);https://stackoverflow.com/questions/39465443
复制相似问题