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

时间:2016-09-13 08:27:50

标签: postgresql cakephp cakephp-3.0 postgresql-9.4

我有一个查询,当我在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 . '%\') ']]]);` 功能。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

似乎unaccent扩展名设置为public架构。 尝试将其设置为您的架构:

ALTER EXTENSION unaccent
  SET SCHEMA your_schema;

根据Postgresql docs

  

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]);