首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助将查询从PostgreSQL转换为CakePHP

需要帮助将查询从PostgreSQL转换为CakePHP
EN

Stack Overflow用户
提问于 2016-09-13 08:27:50
回答 3查看 296关注 0票数 0

当我在我的PostgreSQL数据库中执行它时,我有一个运行良好的查询,但是我无法使它在我的控制器中工作。

这是一个查询:

SELECT id, nume, prenume FROM cirrus.personal WHERE unaccent(nume) ILIKE '%bala%' OR unaccent(prenume) ILIKE '%bala%';

这个查询的特别之处在于,我使用了PostgreSQL数据库的PostgreSQL扩展,因为当我搜索一个必须对'a''ă'这样的特殊字符不敏感的人的名字时,我就需要它。

我现在在PersonalController.php中的查询如下:

代码语言:javascript
复制
$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 . "%)"中,但是这些方法的工作方式都与我试图完成的查询不同。

如有任何建议,将不胜感激。

编辑:

我已经设法在我的控制器中创建了所需的查询。看起来是这样的:

代码语言:javascript
复制
    $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()函数时遇到了困难。有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-14 09:22:23

unaccent扩展似乎设置为public模式。尝试将其设置为模式:

代码语言:javascript
复制
ALTER EXTENSION unaccent
  SET SCHEMA your_schema;

根据Postgresql文档

集模式 此表单将扩展的对象移动到另一个架构中。

票数 1
EN

Stack Overflow用户

发布于 2016-09-13 09:30:39

尝尝这个

代码语言:javascript
复制
    $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%\''
            )
        )
    ))
票数 0
EN

Stack Overflow用户

发布于 2018-03-09 14:29:03

根据文档,您需要使用bind来避免sql注入的问题。

https://book.cakephp.org/3.0/en/orm/query-builder.html#binding-values

尝尝这个

代码语言:javascript
复制
$orWhere = [
            "unaccent(nume) ilike '%'||unaccent(:search)||'%' ",
            "unaccent(prenume) ilike '%'||unaccent(:search)||'%' ",
        ];
$qry->bind(':search', $search, 'string');
$qry->where(['OR' => $orWhere]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39465443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档