Доброго времени суток всем поклонникам Zend Framework. Думаю, что многие из вас знают, любят и используют класс Zend_Db_Select для построения sql запросов. Несомненно, у такого подхода есть масса плюсов. Достаточно изучить документацию, чтобы с легкостью писать простейшие запросы в БД. Но что, если требуемые запросы не совсем просты?
На Хабре уже были посты по решению подобного рода проблем. Но недавно передо мной встала задача написания следующего запроса:
Вроде бы ничего сложного, первое что приходит в голову — использование метода orWhere:
Но это сгенерирует нам следующий 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 );
В итоге мы имеем абсолютно правильный запрос. Всем удачного кодинга ;)