Nella mia classe Mapper sto estendendo AbstractDbMapper
da ZfcBase
per recuperare le righe dal database. Un semplice esempio potrebbe essere il codice come questo:Converti Zend Db ResultSet HydratingResultSet in matrice di oggetti
class MyMapper extends AbstractDbMapper
{
//...
public function fetchAll() {
$select = $this->getSelect();
return $this->select($select); // returns HydratingResultSet
}
}
Il problema è che $this->select()
restituisce un Zend\Db\ResultSet\HydratingResultSet
(contenente gli oggetti necessari e idrati). Ma mi piacerebbe restituire una matrice di questi oggetti invece di uno HydratingResultSet
contenente gli oggetti.
La prima cosa da guardare sarebbe HydratingResultSet::toArray()
ma restituisce una matrice multidimensionale invece di una matrice di oggetti.
così ho scelto di farlo a mano:
public function fetchAll() {
$select = $this->getSelect();
$results = array();
foreach ($this->select($select) as $object) {
$results[] = $object;
}
return $results; // returns array of needed objects
}
Questo funziona, ma sembra brutto in ogni metodo di recuperare. Devo modificare il codice da select() per ottenere il comportamento desiderato o esiste un modo più semplice?
Btw: Si consiglia di restituire un array o convertirlo in questo modo? Grazie per l'aiuto!
C'è un motivo per cui è necessario un array? Il Resultset funzionerà perfettamente come un iteratore e può essere utilizzato nella maggior parte dei casi. Non esiste un metodo integrato per ottenere l'array senza fare ciò che si sta facendo ora, è possibile aggiungere il metodo nel proprio Mapper o semplicemente Hydrator come scorciatoia. – Andrew
Sto usando questi risultati nel mio controller e penso che sarebbe più pulito lavorare con gli array invece di alcuni oggetti Zend \ Db. Non capisco perché hanno scelto di farlo in questo modo ... – lorey
hanno scelto di farlo in questo modo perché si ottengono funzionalità aggiuntive, come il buffering del set di risultati ecc. Pensa se hai una collezione di 9 milioni di oggetti, la matrice diventerà ENORME e consumerà RAM, con questa raccolta gli oggetti sono fatti su richiesta uno alla volta, è molto più efficiente. – Andrew