CAKEPHP УСЛОВИЯ ИЛИ Заявление - PullRequest
0 голосов
/ 03 октября 2011

Я пытаюсь отфильтровать результаты поиска по шаблону LIKE.Я также хочу добавить несколько операторов ИЛИ, если конечный пользователь вводит несколько ключевых слов.Но Мой запрос возвращает все результаты вместо результатов фильтрации, ниже приведен код

        function search()
        {
            $queries = explode(" ", $this->data['Project']['query']);
            $nq = '';
            foreach($queries as $q)
            {
                $nq[] = array('Project.project_title LIKE'=>"%$q%");
            }

            $final = array("OR"=>$nq);

            debug($this->Project->find('list',$final));
        }



1   SHOW FULL COLUMNS FROM `projects`       28  28  16
2   SELECT CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLLATIONS WHERE COLLATION_NAME= 'latin1_swedish_ci';     1   1   1
3   SHOW FULL COLUMNS FROM `users`      2   2   8
4   SELECT CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLLATIONS WHERE COLLATION_NAME= 'utf8_general_ci';       1   1   1
5   SHOW FULL COLUMNS FROM `categories`     6   6   11
6   SHOW FULL COLUMNS FROM `operating_systems`      2   2   7
7   SHOW FULL COLUMNS FROM `project_operating_systems`      3   3   10
8   SHOW FULL COLUMNS FROM `projects_categories`        3   3   12
9   SELECT `Project`.`id`, `Project`.`project_title` FROM `projects` AS `Project` WHERE 1 = 1       4   4   1
10  SELECT `Category`.`id`, `Category`.`name`, `Category`.`parent_id`, `Category`.`url`, `Category`.`lft`, `Category`.`rght`, `ParentCategory`.`id`, `ParentCategory`.`name`, `ParentCategory`.`parent_id`, `ParentCategory`.`url`, `ParentCategory`.`lft`, `ParentCategory`.`rght` FROM `categories` AS `Category` LEFT JOIN `categories` AS `ParentCategory` ON (`Category`.`parent_id` = `ParentCategory`.`id`) WHERE 1 = 1 

Ответы [ 2 ]

1 голос
/ 04 октября 2011
debug($this->Project->find('list',array('conditions'=>$final)));
0 голосов
/ 03 февраля 2014

При построении запроса с серией таких or всегда соблюдайте осторожность, заключая в скобки ваши условия OR, иначе вы отмените условия AND.

Пример:

SELECT * 
FROM users
WHERE type='teacher'

дает только учителя.

SELECT * 
FROM users
WHERE type='teacher'
AND name like '%Joe%'

Это дает только учителям с "Джо" где-то на их имя.ОДНАКО:

SELECT * 
FROM users
WHERE type='teacher'
AND name like '%Joe%'
OR name like '%Mary%'

Можно ожидать, что это даст учителям, которых зовут «Джо» или «Мэри» ... но это не так.Это даст вам ЛЮБОГО пользователя, которого зовут "Мэри".Чтобы исправить это, вы используете скобки:

SELECT * 
FROM users
WHERE type='teacher'
AND 
(name like '%Joe%'
OR name like '%Mary%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...