2013-09-02 9 views
11

Nell'app Zend, utilizzo Zend\Db\TableGateway e Zend\Db\Sql per recuperare i dati dal database MySQL come di seguito.Questo risultato è un set di risultati forward, il richiamo rewind() dopo lo spostamento non è supportato - Zend

Modello -

public function getCandidateEduQualifications($id) 
{ 
    $id = (int) $id; 

    $rowset = $this->tableGateway->select(function (Sql\Select $select) use ($id) 
    { 
     $select->where 
      ->AND->NEST->equalTo('candidate_id', $id) 
      ->AND->equalTo('qualification_category', 'Educational'); 
    }); 

    return $rowset; 
} 

View -

Ho appena iterare $ set di righe e l'eco in vista. Ma dà errore quando prova a eche due o più volte. L'iterazione singola funziona.

Tale risultato è un set di risultati forward solo, chiamando riavvolgimento() dopo andare avanti non è supportato

posso risolverlo caricando in un'altra matrice in vista. Ma è il modo migliore? C'è un altro modo per gestire questo?

$records = array(); 
foreach ($edu_qualifications as $result) { 
    $records[] = $result; 
} 

EDIT -

$resultSet->buffer(); risolto il problema.

risposta

13

Si riceve questo Exception perché questo è il comportamento previsto. Zend usa PDO per ottenere il suo Zend\Db\ResultSet\Resultset che viene restituito da Zend\Db\TableGateway\TableGateway. I set di risultati PDO utilizzano un cursore forward-only di default, il che significa che è possibile effettuare il ciclo solo una volta del set.

Per ulteriori informazioni sui cursori, consultare l'articolo Wikipedia e this.

Come il Zend\Db\ResultSet\Resultset implementa PHP Iterator è possibile estrarre una serie di set con il metodo Zend\Db\ResultSet\Resultset:toArray() o utilizzando la funzione iterator_to_array(). Fai attenzione però a usare questa funzione su dataset potenzialmente di grandi dimensioni! Una delle cose migliori dei cursori è proprio che evitano di portare tutto in una volta sola, nel caso in cui il set di dati sia troppo grande, quindi ci sono momenti in cui non vorrai mettere tutto in un array in una volta.

+3

Che dire del buffer()? – ChamingaD

+8

Con 'Zend \ Db \ ResultSet \ Resultset :: buffer()' ogni volta che viene richiamato 'Zend \ Db \ ResultSet \ Resultset :: current()' la riga corrente verrà mantenuta in 'Zend \ Db \ ResultSet \ Resultset: : $ buffer' mentre si scorre il set. Questo ciclo potrebbe essere un 'foreach()'.Quindi, basicamente sul primo 'foreach()' i dati verranno dal tuo database e sul secondo ciclo verrà da 'Zend \ Db \ ResultSet \ Resultset :: $ buffer'. Se vuoi usare 'Zend \ Db \ ResultSet \ Resultset :: buffer()' devi invocarlo prima di eseguire il looping del set perché il set deve sapere che ha bisogno di buffer. –

+0

Chi ha deciso che era una buona idea non poter ripetere lo stesso set di risultati due volte? Questo è solo 10 livelli di ritardo. – stef

4

Certo, Sembra che quando usiamo Mysql e vogliamo iterare $ resultSet, questo errore accadrà, b/c MySQLi fa solo previsionali in movimento set di risultati (Fare riferimento a questo post: ZF2 DB Result position forwarded?)

I ha incontrato anche questo problema. Ma quando aggiungere riga seguente, ha risolto:

$resultSet->buffer(); 

ma in questo post menzionato, suggerire utilizzare la seguente riga. Mi chiedo solo perché, e qual è la loro differenza:

$resultSet->getDataSource()->buffer(); 
+0

Sebbene la spiegazione tecnica sulla soluzione accettata sia importante, questa dovrebbe essere la soluzione accettata in quanto è l'approccio più semplice per risolvere il problema iniziale. –

0

Questo ha funzionato per me.

public function fetchAll() 
    { 

     $select = $this->tableGateway->getSql()->select(); 
     $resultSet = $this->tableGateway->selectWith($select); 
     $resultSet->buffer(); 
     $resultSet->next(); 

     return $resultSet; 
    } 
0
$sql = new Zend\Db\Sql($your_adapter); 

$select = $sql->select('your_table_name'); 

$statement = $sql->prepareStatementForSqlObject($select); 

$results = $statement->execute(); 

$resultSet = new ResultSet(); 

$resultSet->initialize($results); 

$result = $resultSet->toArray(); 
Problemi correlati