2013-09-02 19 views
11

Trong ứng dụng Zend, tôi sử dụng Zend\Db\TableGatewayZend\Db\Sql để truy xuất dữ liệu từ cơ sở dữ liệu MySQL như dưới đây.Kết quả này là tập hợp chỉ chuyển tiếp, gọi rewind() sau khi di chuyển về phía trước không được hỗ trợ - Zend

Người mẫu -

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 -

Tôi chỉ lặp $ rowset và echo theo quan điểm. Nhưng nó cho lỗi khi cố gắng lặp lại hai hoặc nhiều lần. Lặp lại đơn hoạt động.

Kết quả này là một tiền đạo duy nhất tập hợp kết quả, gọi tua lại() sau khi tiến lên phía trước không được hỗ trợ

tôi có thể giải quyết nó bằng cách tải nó đến một mảng theo quan điểm. Nhưng đó có phải là cách tốt nhất không? Có cách nào khác để xử lý việc này không?

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

EDIT -

$resultSet->buffer(); giải quyết vấn đề.

Trả lời

13

Bạn nhận được điều này Exception vì đây là hành vi được mong đợi. Zend sử dụng PDO để nhận được Zend\Db\ResultSet\Resultset được trả lại bằng Zend\Db\TableGateway\TableGateway. Các bộ kết quả PDO sử dụng con trỏ chỉ chuyển tiếp theo mặc định, có nghĩa là bạn chỉ có thể lặp qua tập hợp một lần.

Để biết thêm thông tin về con trỏ, hãy kiểm tra Wikipediathis bài viết.

Khi Zend\Db\ResultSet\Resultset triển khai PHP Iterator, bạn có thể trích xuất một mảng của tập hợp bằng cách sử dụng phương thức Zend\Db\ResultSet\Resultset:toArray() hoặc sử dụng chức năng iterator_to_array(). Hãy cẩn thận mặc dù về việc sử dụng chức năng này trên các tập dữ liệu có khả năng lớn! Một trong những điều tốt nhất về con trỏ chính là chúng tránh mang theo mọi thứ trong một lần, trong trường hợp tập dữ liệu quá lớn, vì vậy có những lúc bạn không muốn đặt tất cả vào một mảng cùng một lúc.

+3

Điều gì về bộ đệm()? – ChamingaD

+8

Với 'Zend \ Db \ ResultSet \ Resultset :: buffer()' mỗi lần 'Zend \ Db \ ResultSet \ Resultset :: current()' được gọi là hàng hiện tại sẽ được giữ trong 'Zend \ Db \ ResultSet \ Resultset: : $ buffer' khi bạn lặp qua tập hợp. Vòng lặp này có thể là một 'foreach()'.Vì vậy, cơ bản trên 'foreach() đầu tiên 'dữ liệu sẽ đến từ cơ sở dữ liệu của bạn và trên vòng lặp thứ hai nó sẽ đến từ' Zend \ Db \ ResultSet \ Resultset :: $ buffer'. Nếu bạn định sử dụng 'Zend \ Db \ ResultSet \ Resultset :: buffer()', bạn phải gọi nó trước khi bạn lặp lại thông qua tập hợp vì tập hợp phải biết nó cần phải đệm. –

+0

Ai đã quyết định rằng bạn không thể lặp lại cùng một tập kết quả hai lần? Đây chỉ là 10 cấp độ chậm phát triển. – stef

4

Chắc chắn, Dường như khi chúng ta sử dụng Mysql và muốn lặp $ ResultSet, lỗi này sẽ xảy ra, b/c mysqli chỉ làm về phía trước chuyển động bộ kết quả (Tham khảo bài này: ZF2 DB Result position forwarded?)

tôi cũng đã gặp phải vấn đề này. Nhưng khi thêm dòng sau, nó được giải quyết:

$resultSet->buffer(); 

nhưng trong bài viết được đề cập này, đề xuất sử dụng dòng sau. Tôi tự hỏi tại sao, và sự khác biệt của chúng là gì:

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

Mặc dù giải thích kỹ thuật về giải pháp được chấp nhận là quan trọng, đây phải là giải pháp được chấp nhận vì nó là cách tiếp cận dễ dàng hơn để giải quyết vấn đề ban đầu. –

0

Điều này làm việc cho tôi.

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(); 
Các vấn đề liên quan