2013-09-02 5 views
11

W aplikacji Zend używam Zend\Db\TableGateway i Zend\Db\Sql do pobierania danych z bazy danych MySQL, jak poniżej.Ten wynik jest zbiorem wynikowym tylko do przodu, wywołanie rewind() po przeniesieniu do przodu nie jest obsługiwane - Zend

Model -

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 -

Właśnie iterate $ zestaw wierszy i echo w widoku. Ale daje błąd przy próbie echa dwa lub więcej razy. Działa pojedyncza iteracja.

Ten wynik jest do przodu tylko zestaw wyników, wzywając do tyłu() po naprzód nie jest obsługiwana

mogę go rozwiązać poprzez załadowanie go do innego tablicy w widoku. Ale czy to najlepszy sposób? Czy jest jakaś inna metoda radzenia sobie z tym?

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

EDIT -

$resultSet->buffer(); rozwiązać ten problem.

Odpowiedz

13

Otrzymujesz ten Exception ponieważ jest to oczekiwane zachowanie. Zend wykorzystuje PDO aby uzyskać jego Zend\Db\ResultSet\Resultset który jest zwracany przez Zend\Db\TableGateway\TableGateway. Zestawy wyników PDO domyślnie używają kursora tylko do przodu, co oznacza, że ​​można przechodzić tylko raz przez zestaw. Aby uzyskać więcej informacji o kursorach, sprawdź artykuł Wikipedia i this.

Jako Zend\Db\ResultSet\Resultset realizuje PHP Iterator można wyodrębnić szereg zestawu przy użyciu metody Zend\Db\ResultSet\Resultset:toArray() lub za pomocą funkcji iterator_to_array(). Zachowaj ostrożność, jeśli chodzi o używanie tej funkcji w potencjalnie dużych zbiorach danych! Jedną z najlepszych rzeczy na temat kursorów jest właśnie to, że nie wnosić wszystkiego za jednym razem, w przypadku, gdy zestaw danych jest zbyt duży, więc zdarza się, że nie będzie chciał umieścić to wszystko do tablicy naraz.

+3

Co o buforze()? – ChamingaD

+8

z 'Zend \ \ Db ResultSet \ Resultset :: bufor()' każdorazowo 'Zend \ Db \ wynikowa \ resultSet :: prądu() jest wywoływana' bieżącego wiersza będą przechowywane w 'Zend \ \ Db ResultSet \ Resultset: : $ buffer' podczas przechodzenia przez zestaw. Ta pętla może być 'foreach()'.Tak więc na pierwszym 'foreach()' dane będą pochodzić z bazy danych, a na drugiej pętli będzie pochodzić z 'Zend \ Db \ ResultSet \ Resultset :: $ buffer'. Jeśli zamierzasz użyć 'Zend \ Db \ ResultSet \ Resultset :: buffer()' musisz wywołać go przed przejściem przez zestaw, ponieważ zestaw musi wiedzieć, że musi buforować. –

+0

Kto zdecydował, że to dobry pomysł, że nie możesz dwukrotnie wykonać tego samego zestawu wyników? To tylko 10 poziomów opóźnionego. – stef

4

pewno, to wygląda, gdy używamy MySQL i chcesz iteracyjne $ wynikowego, ten błąd będzie się działo, b/c mysqli tylko robi naprzód poruszających zestawów wyników (patrz do tego postu: ZF2 DB Result position forwarded?)

I natknąłem się na ten problem. Ale gdy Dodaj następujący wiersz, to rozwiązany:

$resultSet->buffer(); 

ale w tym wspomniano post, to proponuję używać następujących linii. Zastanawiam się tylko dlaczego i jaka jest ich różnica:

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

Chociaż techniczne wyjaśnienie przyjętego rozwiązania jest ważne, powinno to być przyjęte rozwiązanie, ponieważ jest to łatwiejsze podejście do rozwiązania początkowego problemu. –

0

To zadziałało dla mnie.

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(); 
Powiązane problemy