Gần đây tôi đã bắt đầu sử dụng Zend Framework (1.8.4), để cung cấp công cụ quản trị để xem các đơn đặt hàng của trang web giỏ hàng.Zend: Hai đối tượng, một hàng
Điều tôi muốn làm là tạo các mô hình nhiều mô hình (Zend_Db_Table_Row_Abstract
) hiệu quả từ một hàng kết quả cơ sở dữ liệu duy nhất.
Mối quan hệ đơn giản: một Đơn đặt hàng có một Khách hàng (khóa ngoài order_custid=customer.cust_id
); Khách hàng có nhiều Đơn đặt hàng.
Tải đơn đặt hàng dễ dàng. Sử dụng phương pháp ghi nhận ở đây:
Modeling objects with multiple table relationships in Zend Framework
... Sau đó tôi có thể lấy các khách hàng đối với từng.
foreach ($orderList as $o)
{
cust = $o->findParentRow('Customers');
print_r ($cust); // works as expected.
}
Nhưng khi bạn tải một danh sách dài các đơn đặt hàng - ví dụ: 40 trở lên, một trang - điều này rất chậm.
Tiếp theo, tôi cố gắng lệnh JOIN:
$custTable = new Customers();
$orderTable = new Orders();
$orderQuery = $orderTable->select()
->setIntegrityCheck(false) // allows joins
->from($orderTable)
->join('customers', 'cust_id=order_custid')
->where("order_status=?", 1); //incoming orders only.
$orders = $orderTable->fetchAll($orderQuery);
này mang lại cho tôi một mảng của các đối tượng theo thứ tự. print_r($orders)
cho thấy mỗi một trong số chúng chứa danh sách cột mà tôi mong đợi, trong một thành viên được bảo vệ, với tên trường thô order_ * và cust_ *.
Nhưng cách tạo đối tượng khách hàng từ các trường cust_ * mà tôi tìm thấy trong từng đối tượng Order đó?
foreach ($orders as $o) {
$cols = $o->toArray();
print_r ($cols); // looks good, has cust_* fields...
$cust = new Customer(array('table' => 'Customer', 'data' => $cols));
// fails - $cust->id, $cust->firstname, etc are empty
$cust->setFromArray($cols);
// complains about unknown 'order_' fields.
}
Có cách nào tốt để tạo đối tượng đặt hàng và khách hàng đồng thời từ các hàng được nối không? Hoặc tôi phải chạy truy vấn mà không có cổng bảng, có được một tập hợp kết quả thô và sao chép từng trường một lần vào các đối tượng mới được tạo không?
Theo như tôi biết Zend_Db không làm điều đó. Tôi cũng rất thích một giải pháp. – markus