Я уверен, что это невозможно в Zend Framework (я искал в Интернете, документацию и отслеживание проблем), но я просто хочу убедиться, что я прошу здесь.
$select = $this->select(); $select->union($select1, $select2);
Это не работает, конечно. Объяснить, что мне нужно. Мне нужно использовать UNION (), чтобы объединить 2 таблицы в запросе SELECT, я знаю, что могу просто сделать:
$select = "$select1 UNION $select2";
Проблема в том, что вернет строку, и мне нужно получить объект select, чтобы я мог использовать его с Zend_Paginator.
Я уже решил проблему, изменив мою архитектуру базы данных, но мне просто любопытно, есть ли какое-то решение для этого.
Zend_Db_Select имеет метод объединения, поэтому я подумал, что это возможно, если вы можете построить свой запрос с помощью объекта select. Я не использовал Zend_Db_Select (или подкласс таблицы) с объединением, но я бы предположил, что вы можете сделать что-то вроде
$select = $this->select() ->where('blah') ->union($sql);
Вот что я сделал, чтобы создать союз:
$select = $this->select(); //common select from both sides of the union goes here $select1 = clone($select); //select1 specifics here $select2 = clone($select); //select 2 specifics here $db = $this->getAdapter(); $pageselect = $db->select()->union(array("($select1)", "($select2)"));
Помните, Db_Select
__toString
Db_Select
распечатает SQL, сгенерированный этим выбором, чтобы помочь вам отлаживать.
полный пример:
public function getReservationById($id) { if(!$id) return null; $sql = $this->table->select(); $sql->union(array( $this->table->select()->where('id=?', $id), $this->tableFinished->select()->where('id=?', $id), $this->tableCanceled->select()->where('id=?', $id), $this->tableTrashed->select()->where('id=?', $id) )); echo $sql->__toString(); }
и сгенерированный запрос:
SELECT reservations
. * FROM reservations
WHERE (id = '5658') UNION SELECT res_finished
. * FROM res_finished
WHERE (id = '5658') UNION SELECT res_cancel
. * FROM res_cancel
WHERE (id = '5658') UNION SELECT res_trash
. * FROM res_trash
WHERE (id = '5658')
Этот практический пример показывает функцию, которая возвращает набор строк из последних или доступных доступных записей в блоге в конкретный год (блог об искусстве):
public function fetchBestOf($year) { $selectLatest = $this->select()->where('isHidden = 0') ->where('YEAR(dateCreated) = ' . $year) ->where('isHighlight = 0'); $selectHighlights = $this->select()->where('isHidden = 0') ->where('YEAR(dateCreated) = ' . $year) ->where('isHighlight = 1'); $selectUnion = $this->select()->union(array($selectLatest, $selectHighlights), Zend_Db_Select::SQL_UNION_ALL) ->order('isHighlight DESC') ->order('dateCreated DESC') ->order('workID DESC') ->limit('5'); $rowset = $this->fetchAll($selectUnion); return $rowset; }
Лучший способ, который предлагает Zend, следующий:
$sql = $this->_db->select() ->union(array($select1, $select2,$select3)) ->order('by_someorder'); echo $sql->__toString(); $stmt = $db->query($sql); $result = $stmt->fetchAll();
echo отобразит запрос
Здесь $ select1, $ select2, $ select3 могут быть разными выборками с одинаковым количеством столбцов …
Вот как это работает для меня:
$select1 = $this->select(); $select2 = $this->select();
После получения необходимых данных в обоих запросах синтаксис UNION будет выглядеть следующим образом:
$select = $this->select()->union(array('('.$select1.')', '('.$select2.')'));