3

I'm using ZendFramework 2 and TableGateway which is fine for normal select statements. But I can't seem to find how to get a max of a column using ZendFramework 2 select. My select should look something like

SELECT MAX( `publication_nr` ) AS maxPubNr FROM `publications` 

and my code looks like:

use Zend\Db\TableGateway\TableGateway;
class PublicationsTable
{
protected $tableGateway;
...
public function getMaxPubicationNr()
{
    $rowset = $this->tableGateway->select(array('maxPubNr' => new Expression('MAX(publication_nr)')));
    $row = $rowset->current();
    if (!$row) {
        throw new \Exception("Could not retrieve max Publication nr");
    }
    return $row;
}
4

1 回答 1

6

如果您查看 TableGateway,您会注意到 Select 方法的参数实际上传递给了查询的 Where 部分,这使您的查询不正确。

您需要直接修改 Select Object,因为 TableGateway 不会为您提供任何代理方法来执行此操作。

你可以尝试这样的事情:

public function getMaxPubicationNr()
{
    $select = $this->tableGateway->getSql()->select();
    $select->columns(array(
        'maxPubNr' => new Expression('MAX(publication_nr)')
    ));
    // If you need to add any where caluses you would need to do it here
    //$select->where(array());

    $rowset = $this->tableGateway->selectWith($select);
    $row = $rowset->current();
    if (!$row) {
        throw new \Exception("Could not retrieve max Publication nr");
    }

    return $row;
}

我还没有测试过,但这应该能让你到达那里:)

不过,您可能会遇到另一个问题,这将是由于 TableGateway 试图从结果中为您构建一个对象,但您并没有带回一整行来构建一个对象,您只是带回了一个柱子。

我只是添加使用 Db/Select 对象来执行此操作,而不是打扰 GateWay,老实说,我认为它不应该像这样使用。

于 2013-07-03T15:36:31.477 回答