Trong lớp Mapper của tôi, tôi mở rộng AbstractDbMapper
từ ZfcBase
để tìm nạp các hàng từ cơ sở dữ liệu. Một ví dụ đơn giản sẽ là mã như thế này:Chuyển đổi Zend Db ResultSet HydratingResultSet thành Mảng đối tượng
class MyMapper extends AbstractDbMapper
{
//...
public function fetchAll() {
$select = $this->getSelect();
return $this->select($select); // returns HydratingResultSet
}
}
Vấn đề là $this->select()
trả về một Zend\Db\ResultSet\HydratingResultSet
(chứa các đối tượng cần thiết và ngậm nước). Nhưng tôi muốn trả về một mảng các đối tượng này thay vì HydratingResultSet
chứa các đối tượng.
Điều đầu tiên để xem xét sẽ là HydratingResultSet::toArray()
nhưng điều này trả về mảng đa chiều thay vì một mảng đối tượng.
Vì vậy, tôi đã chọn để làm điều đó bằng tay:
public function fetchAll() {
$select = $this->getSelect();
$results = array();
foreach ($this->select($select) as $object) {
$results[] = $object;
}
return $results; // returns array of needed objects
}
này hoạt động nhưng trông xấu xí trong mọi phương pháp lấy. Tôi có phải sửa đổi mã từ select() để có được hành vi mong muốn hoặc có cách nào dễ dàng hơn không?
Btw: Thậm chí nó được đề nghị trả về một mảng hay chuyển đổi nó như thế này? Cảm ơn bạn đã giúp đỡ!
Có lý do nào bạn cần một mảng không? Các Resultet sẽ làm việc như một iterator tốt và có thể được sử dụng trong hầu hết các trường hợp .. Không có phương pháp tích hợp để lấy mảng mà không làm những gì bạn đang làm bây giờ, bạn có thể thêm phương thức vào Mapper của bạn hoặc một Hydrator chỉ như một đường tắt. – Andrew
Tôi đang sử dụng các kết quả này trong Bộ điều khiển của mình và cho rằng nó sẽ sạch hơn khi hoạt động với các mảng thay vì một số đối tượng Zend \ Db. Tôi không hiểu tại sao họ lại chọn cách này ... – lorey
họ chọn làm theo cách này bởi vì bạn nhận được thêm chức năng, chẳng hạn như đệm bộ kết quả, vv Hãy suy nghĩ về nếu bạn có bộ sưu tập 9million đối tượng, bạn sẽ trở thành HUGE và tiêu thụ RAM, với bộ sưu tập này theo yêu cầu tại một thời điểm, nó hiệu quả hơn nhiều. – Andrew