我有一个查询,当我在PostgreSQL数据库中执行它时效果很好但是我不能让它在我的控制器中运行。
这是查询:
SELECT id, nume, prenume FROM cirrus.personal
WHERE unaccent(nume) ILIKE '%bala%' OR unaccent(prenume) ILIKE '%bala%';
关于这个查询的特殊之处在于我使用了PostgreSQL数据库的unaccent()
扩展名,因为我需要它来搜索具有术语的人的姓名,这些术语必须对特殊字符(例如{)不敏感{1}}和'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)
,但这些方法与我尝试的SQL查询的工作方式相同完成。
任何建议都会很高兴。
编辑:
我已设法在我的控制器中创建所需的查询。它看起来像这样:
"unaccent(%" . $term . "%)"
但现在CakePhp无法识别 $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 . '%\') ']]]);`
功能。任何人都可以帮助我吗?
答案 0 :(得分:1)
似乎unaccent
扩展名设置为public
架构。
尝试将其设置为您的架构:
ALTER EXTENSION unaccent
SET SCHEMA your_schema;
SET SCHEMA
This form moves the extension's objects into another schema.
答案 1 :(得分:0)
试试这个
$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%\''
)
)
))
答案 2 :(得分:0)
根据文档,您需要使用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]);