2013-04-03 38 views
2

我使用TableGateway和附加的自定義RowGateway對象。如果我想使用TableGateway-> getSql() - > select()返回的對象來獲取記錄計數,則附加的RowGateway對象會報告結果集中缺少主鍵。ZF2 ResultSet和計數性能

$tablegateway = new TableGateway('table', $adapter, new RowGatewayFeature(new AuditingRowGateway($primkey, 'table', $adapter), new ResultSet()); 
    $select = $tablegateway->getSql()->select(); 
    $select->columns(array('num' => new \Zend\Db\Sql\Expression('COUNT(*)'))); 
    $row = $tablegateway->selectWith($select)->current(); 

結果:Zend的\ DB \ RowGateway \異常\ RuntimeException的:在處理主鍵數據,公知的鍵XXX未在數據陣列中發現

我可以通過發出一個圍繞工作,它正常(即非計數)選擇:

$result = $tablegateway->selectWith($select); 
$count = $result->count(); 

但不確定這種性能方面與'SELECT COUNT(*)'相比。

+0

請問您定製RowGateway擴展的Zend \ DB \ RowGateway \ AbstractRowGateway? –

+0

是的,但如果我使用默認的RowGateway,問題也存在。我現在發現了另一種解決方法:我創建了兩個TableGateways,一個用於選擇和計數,另一個用於寫入,後者使用我的AuditingRowGateway記錄所有更改。 – Arthur

+0

你在使用RowGateway還是TableGateway?你的例子令人困惑......看起來像TableGateway NOT Row .. – Andrew

回答

3

即使只需要一個計數值,如果將主鍵包含在columns數組中,它應該可以工作。

$select->columns(array($primkey, 'num' => new \Zend\Db\Sql\Expression('COUNT(*)'))); 
+0

它沒有爲我工作,但給了一個主意。 '$ primkey => new \ Zend \ Db \ Sql \ Expression('COUNT(*)')'工作,但它很醜陋。 – Arthur

0

什麼工作對我來說:
$select->columns(array('id'=>'id', 'nr'=>new \Zend\Db\Sql\Expression('COUNT(*)')));