我正在将我的 web 应用程序从 zf1 移动到 zf2 并且在我遇到的 sql 查询问题中,我不知道如何进行联合。
我曾经能够使
$select->union($select1, $select2, $select3)
但是 Zend\Db\Sql\Select 不再有union()
方法了。
还有一种方法可以在使用 zf2 的查询中进行联合吗?
我正在将我的 web 应用程序从 zf1 移动到 zf2 并且在我遇到的 sql 查询问题中,我不知道如何进行联合。
我曾经能够使
$select->union($select1, $select2, $select3)
但是 Zend\Db\Sql\Select 不再有union()
方法了。
还有一种方法可以在使用 zf2 的查询中进行联合吗?
我使用这个https://github.com/zendframework/zf2/pull/3962。(两个选择查询的联合)。
只是为了完成这个答案,我用它来组合/联合 3 个选择:
$Sql = new Sql ( $adapter );
$select1 = $Sql->select();
$select1->from(...);
$select2 = $Sql->select();
$select2->from(...);
//union of two first selects
$select1->combine ( $select2 );
//create the third select
$select3 = $Sql->select();
$select3->from(...);
//Final select
$select = $Sql->select();
$select->from(array('sel1and2' => $select1));
$select->combine ( $select3 );
$select->order($order);
小心订购,不要与 combine 一起使用!见ZF2 联合 + 分页
作为那些希望轻松使用 >1 UNION 的人的替代方案,ZF2 有一个专用的类Zend\Db\Sql\Combine:
new Combine(
[
$select1,
$select2,
$select3,
...
]
)
或者
(new Combine)->union($select);
这是由 UNION 组合的四个 SELECT 的“大量解决方法”示例:
$sm = $this->getServiceLocator();
$adapter = $sm->get('Zend\Db\Adapter\Adapter');
$columns = array(
'date', 'business_unit', 'project', 'cost_center',
'some_value1' => new Expression('SUM(IF(recruitment = \'internal\',1,0))'),
'some_value2' => new Expression('SUM(IF(recruitment = \'external\',1,0))'),
'some_value3' => new Expression('SUM(total_employees)'),
'some_value4' => new Expression('SUM(IF(recruitment = \'internal\',total_time,0))'),
'some_value5' => new Expression('SUM(IF(recruitment = \'external\',total_time,0))'),
'some_value6' => new Expression('SUM(total_time)')
);
$sql = new Sql($adapter);
$abstractSelect = $sql->select();
$abstractSelect->from('summary')
->columns($columns)
->where->equalTo('date', '2013-01-25')
->where->equalTo('business_unit', 'foo')
->where->equalTo('project', 'bar');
$select1 = clone($abstractSelect);
$select2 = clone($abstractSelect);
$select2->where->equalTo('attendant', '1');
$select3 = clone($abstractSelect);
$select3->where->equalTo('attendant', '0')
->where->equalTo('recruitment', 'internal');
$select4 = clone($abstractSelect);
$select4->where->equalTo('attendant', '0')
->where->equalTo('disbursal', '0');
$selects = array(
$select1->getSqlString(),
$select2->getSqlString(),
$select3->getSqlString(),
$select4->getSqlString()
);
$union = implode(" UNION ", $selects);
$statement = $adapter->createStatement(str_replace('"', '`', $union));
$results = $statement->execute();
这不会赢得任何代价,但也许有人可以改进这一点。
最后两行很重要。您可以解析任何您喜欢的 UNION 查询。