Intereting Posts
Лучший способ найти последний вставленный идентификатор в mysql, используя php Должен ли я использовать <объект> или <iframe> для загрузки видео? Имеет больше проблем с mysqli. Числовые данные в результатах Доступ к последней созданной строке в PHP / MySQL PHP получает пустые переменные $ _POST из вызова Ajax WP_Query не возвращает результатов Как очистить preg_match_all от пустых значений массива Эхо-проблема с while / if / else Развертывание новой реликвии на кедрах Героку (PHP) Добавить «пользовательскую страницу» без страницы Могу ли я зашифровать PHP-источник или скомпилировать его, чтобы другие его не видели? и как? Примеры XSS, которые я могу использовать для проверки ввода моей страницы? Как я могу проверить с регулярным выражением, что строка содержит только определенные допустимые символы? Запуск команды ремесленников навсегда с кузницей laravel? обработка дубликатов записей в mysql Вставка выражения

Zend Framework Выберите объекты и UNION ()

Я уверен, что это невозможно в 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.')'));