Я нашел странную проблему с использованием CakePHP 1.3 для поиска информации. Давайте использовать этот dbschema в качестве примера:CakePHP, переопределяющий идентичное поле в условиях поиска
идентификатор INT (11) ОСНОВНОЙ auto_increment сумма поплавок (10,2) NULL статус ENUM (завершено, убрано, Pending)
id amount status
1 100.00 Completed
2 100.00 Removed
3 100.00 Completed
4 100.00 Completed
5 100.00 Pending
При использовании торта find
для извлечения данных из этой таблицы, я использую этот запрос:
$this->Testtable->find('all', array(
'conditions' => array(
'status LIKE ' => 'Removed',
'status LIKE ' => 'Pending',
'status LIKE ' => 'Completed'
)
))
Глядя на этот запрос, я бы предположить, что торт будет возвращать все строки, м atch все этих условий (что вполне приемлемо в SQL), однако оно использует только последнее условие и возвращает WHERE status LIKE 'Completed'
.
Я провел тест, делая это, что возвращаемый все строки правильно (я знаю, что это более «правильный» способ сделать запрос в любом случае):
'conditions' => array(
'status' => array('Removed', 'Pending', 'Completed')
)
Возьмите противоположность для примера, я хочу возвращает все строки, которые не Удалены или в ожидании:
'conditions' => array(
'status !=' => 'Removed',
'status !=' => 'Pending'
)
Этот запрос возвращает все строки с Завершенный и Удален, поскольку он слушает только последнее утверждение. Я предполагаю, что это происходит, потому что вместо объединения этих условий поиска в запрос Cake перезаписывает условия, основанные на «поле», которое составляет status !=
. Я могу доказать эту теорию, добавив пространство после !=
в любом из этих условий, создав желаемый результат только подтвержденных записей.
Может ли кто-нибудь сказать мне, почему Cake сделает это? Поскольку это законное дело в SQL, я не вижу причин, по которым Cake не позволит вам это сделать. Кто-нибудь знает, исправлена ли эта проблема в новых версиях Cake?
+1 для устранения собственной проблемы и открытия/дезогнорирования простейшего решения (условия обертывания в другом массиве). Обратите внимание, что при использовании 'LIKE' - если это не шаблон' LIKE', это не лучший выбор для использования =). – AD7six