在 ZF2 中将组合和排序与 Table 网关一起使用
Using combine and order together with Table Gateway in ZF2
在 Zend Framework 2 中将 $select->order(...) 添加到先前组合的 Select 时,"order by" 将仅添加到第一个 Select声明。
SELECT `user`.*
FROM `user` WHERE `user_id` = :where1
ORDER BY `starttime_dt` ASC )
UNION
( SELECT `user`.*
FROM `user`
WHERE `user_id` != :subselect1where1 )
我需要的是排序将应用到完整 Select。这里已经描述了一个解决方案
https://github.com/zendframework/zf2/issues/5162#issuecomment-36294281
但此解决方案适用于 SQL-适配器。
如何使用 Table 网关做到这一点?
我的代码目前看起来像这样(导致上述语句)
$select = $this->tableGateway->getSql()->select();
$select2 = clone $select;
$select->where->equalTo('user_id', $user_id);
$select2->where->notEqualTo('user_id', $user_id);
$select->combine($select2);
$select->order('starttime_dt');
$resultSet = $this->tableGateway->selectWith($select);
您可以使用 table 网关,就像您提供的 link 中说明的那样。
你的代码看起来像
$select = $this->tableGateway->getSql()->select();
$select2 = clone $select;
$select->where->equalTo('user_id', $user_id);
$select2->where->notEqualTo('user_id', $user_id);
$select->combine($select2);
$combinedSelect = (new Zend\Db\Sql\Select)->from(['sub' => $select])->order('starttime_dt');
$statement = $this->sql->prepareStatementForSqlObject($combinedSelect);
$result = $statement->execute();
$resultSet = clone $this->resultSetPrototype;
$resultSet->initialize($result);
您将无法使用 TableGateway 的 selectWith
方法,因为它会检查所提供的 Select 的 table 是否与 TableGateway 的 table 匹配。
在 Zend Framework 2 中将 $select->order(...) 添加到先前组合的 Select 时,"order by" 将仅添加到第一个 Select声明。
SELECT `user`.*
FROM `user` WHERE `user_id` = :where1
ORDER BY `starttime_dt` ASC )
UNION
( SELECT `user`.*
FROM `user`
WHERE `user_id` != :subselect1where1 )
我需要的是排序将应用到完整 Select。这里已经描述了一个解决方案
https://github.com/zendframework/zf2/issues/5162#issuecomment-36294281
但此解决方案适用于 SQL-适配器。
如何使用 Table 网关做到这一点?
我的代码目前看起来像这样(导致上述语句)
$select = $this->tableGateway->getSql()->select();
$select2 = clone $select;
$select->where->equalTo('user_id', $user_id);
$select2->where->notEqualTo('user_id', $user_id);
$select->combine($select2);
$select->order('starttime_dt');
$resultSet = $this->tableGateway->selectWith($select);
您可以使用 table 网关,就像您提供的 link 中说明的那样。
你的代码看起来像
$select = $this->tableGateway->getSql()->select();
$select2 = clone $select;
$select->where->equalTo('user_id', $user_id);
$select2->where->notEqualTo('user_id', $user_id);
$select->combine($select2);
$combinedSelect = (new Zend\Db\Sql\Select)->from(['sub' => $select])->order('starttime_dt');
$statement = $this->sql->prepareStatementForSqlObject($combinedSelect);
$result = $statement->execute();
$resultSet = clone $this->resultSetPrototype;
$resultSet->initialize($result);
您将无法使用 TableGateway 的 selectWith
方法,因为它会检查所提供的 Select 的 table 是否与 TableGateway 的 table 匹配。