Zend Framework Select Objects And UNION () - PullRequest
4 голосов
/ 24 августа 2009

Я почти уверен, что это невозможно в Zend Framework (я искал в Интернете, документации и трекере ошибок), но я просто хочу убедиться, поэтому я спрашиваю здесь.

$select = $this->select();
$select->union($select1, $select2);

Это не работает, конечно. Чтобы объяснить, что мне нужно. Мне нужно использовать UNION () для объединения 2 таблиц в запросе SELECT, я знаю, что я мог бы просто сделать:

$select = "$select1 UNION $select2";

Проблема в том, что будет возвращаться строка, и мне нужно получить объект select, чтобы я мог использовать его с Zend_Paginator.

Я уже решил проблему, изменив архитектуру своей базы данных, но мне просто любопытно, есть ли какое-то решение для этого.

Ответы [ 6 ]

13 голосов
/ 24 августа 2009

Вот что я сделал, чтобы создать союз:

$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 выведет SQL, сгенерированный этим выбором, чтобы помочь вам отладить.

7 голосов
/ 24 августа 2009

Zend_Db_Select имеет метод объединения , поэтому я бы подумал, что это возможно, если вы можете построить свой запрос, используя объект select. Я не использовал Zend_Db_Select (или подкласс таблицы) с объединением, но я думаю, что вы можете сделать что-то вроде

$select = $this->select()
               ->where('blah')
               ->union($sql);
4 голосов
/ 29 октября 2010

полный пример:

 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. * ОТ reservations ГДЕ (id = '5658') UNION SELECT res_finished. * ОТ res_finished ГДЕ (id = '5658') UNION SELECT res_cancel. * ОТ res_cancel WHERE (id = '5658') UNION SELECT res_trash. * ОТ res_trash WHERE (id = '5658')

3 голосов
/ 21 ноября 2011

В этом практическом примере показана функция, которая возвращает набор строк либо самой последней, либо, если доступны избранные записи блога определенного года (художественный блог):

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;
}
2 голосов
/ 22 мая 2012

Наилучший способ, которым Zend предлагает, выглядит следующим образом ...

$sql = $this->_db->select()
    ->union(array($select1, $select2,$select3))
            ->order('by_someorder');

echo $sql->__toString();

$stmt = $db->query($sql);
$result = $stmt->fetchAll();

эхо покажет запрос

Здесь $ select1, $ select2, $ select3 могут быть разными запросами выбора с одинаковыми количество столбцов ...

1 голос
/ 20 июля 2012

Вот как это работает для меня:

$select1 = $this->select();               
$select2 = $this->select();

После получения необходимых данных в обоих запросах синтаксис UNION выглядит следующим образом:

 $select = $this->select()->union(array('('.$select1.')', '('.$select2.')'));  
...