我敢肯定,这是不可能的Zend框架(我在网上搜索,文档和问题跟踪),但我只是想确保,所以我问在这里。
$select = $this->select();
$select->union($select1, $select2);
这并不当然工作。 为了解释我需要什么。 我需要使用UNION()合并在一个SELECT查询2个表,我知道我可能只是这样做:
$select = "$select1 UNION $select2";
问题是,会返回一个字符串,我需要得到一个选择对象,以便我可以Zend_Paginator的使用它。
我已经通过修改我的数据库架构解决了这个问题,但我只是好奇,如果有一些办法解决这个。
Zend_Db_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
会打印出由该选择生成的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();
回声会显示查询
这里选择1,$选择2,$选择3可与相同的列数不同的选择查询...
这是怎么对我的作品:
$select1 = $this->select();
$select2 = $this->select();
在这两个查询的UNION语法是这样获得必要的数据后:
$select = $this->select()->union(array('('.$select1.')', '('.$select2.')'));