Zend框架选择对象和UNION()(Zend Framework Select Objects A

2019-07-03 13:12发布

我敢肯定,这是不可能的Zend框架(我在网上搜索,文档和问题跟踪),但我只是想确保,所以我问在这里。

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

这并不当然工作。 为了解释我需要什么。 我需要使用UNION()合并在一个SELECT查询2个表,我知道我可能只是这样做:

$select = "$select1 UNION $select2";

问题是,会返回一个字符串,我需要得到一个选择对象,以便我可以Zend_Paginator的使用它。

我已经通过修改我的数据库架构解决了这个问题,但我只是好奇,如果有一些办法解决这个。

Answer 1:

Zend_Db_Select对象有工会法 ,所以我会认为这是可能的,如果你可以使用一个选择对象构建查询。 我没有用过Zend_Db_Select对象(或表子类)与工会,但我想像你可以这样做

$select = $this->select()
               ->where('blah')
               ->union($sql);


Answer 2:

这是我做了什么,使一个联盟:

$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,帮你调试。



Answer 3:

一个完整的例子:

 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')



Answer 4:

这个实际的例子显示了返回的任何最新的,或者某一年(艺术品博客)的可用最喜欢的博客条目的行集的功能:

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;
}


Answer 5:

最好的办法Zend的建议就像是如下....

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

echo $sql->__toString();

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

回声会显示查询

这里选择1,$选择2,$选择3可与相同的列数不同的选择查询...



Answer 6:

这是怎么对我的作品:

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

在这两个查询的UNION语法是这样获得必要的数据后:

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


文章来源: Zend Framework Select Objects And UNION()