Как стать автором
Поиск
Написать публикацию
Обновить

Составление запросов со сложными условиями

Время на прочтение1 мин
Количество просмотров9.8K
Доброго времени суток всем поклонникам Zend Framework. Думаю, что многие из вас знают, любят и используют класс Zend_Db_Select для построения sql запросов. Несомненно, у такого подхода есть масса плюсов. Достаточно изучить документацию, чтобы с легкостью писать простейшие запросы в БД. Но что, если требуемые запросы не совсем просты?

На Хабре уже были посты по решению подобного рода проблем. Но недавно передо мной встала задача написания следующего запроса:
SELECT * FROM `table` WHERE `sex`= "male" AND (`age` > 18 OR `hobby` = "sport");

Вроде бы ничего сложного, первое что приходит в голову — использование метода orWhere:
$this->select()
     ->where( "sex = ?", "male" )
     ->where( "age > ?", 18, "INTEGER" )
     ->orWhere( "hobby = ?", "sport" );

Но это сгенерирует нам следующий SQL-код:
SELECT `table`.* FROM `table` WHERE (`table`.`sex`= "male") AND (`table`.`age` > 18) OR (`table`.`hobby` = "sport");

Что является не тем запросом, который мы ожидаем послать к базе. Как же быть? Я предлагаю такое решение:
$select = $this->select();

$condition = $select->orWhere( "age > ?", 18, "INTEGER" )
                    ->orWhere( "hobby = ?", "sport" )
                    ->getPart( Zend_Db_Select::WHERE );
$condition = is_array( $condition ) ? implode( " ", $condition ) : $condition;

$select->reset( Zend_Db_Select::WHERE );

$select->where( "sex = ?", "male" )
       ->where( $condition );

В итоге мы имеем абсолютно правильный запрос. Всем удачного кодинга ;)
Теги:
Хабы:
Всего голосов 16: ↑8 и ↓80
Комментарии32

Публикации

Ближайшие события