我最近开始使用 Zend Framework (1.8.4),为查看购物车网站的订单提供管理工具。
我想做的是Zend_Db_Table_Row_Abstract
从单个数据库结果行有效地创建多个模型()对象。
关系很简单:一个订单有一个客户(外键order_custid=customer.cust_id
);一个客户有很多订单。
加载订单很容易。使用此处记录的方法:
在 Zend Framework 中对具有多个表关系的对象进行建模
...然后我可以抓住每个客户。
foreach ($orderList as $o)
{
cust = $o->findParentRow('Customers');
print_r ($cust); // works as expected.
}
但是,当您加载一长串订单时——比如说,40 个或更多,一页——这会非常缓慢。
接下来我尝试了一个 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);
这给了我一个订单对象数组。 print_r($orders)
显示它们中的每一个都包含我期望的列列表,在一个受保护的成员中,具有原始字段名称 order_* 和 cust_*。
但是如何从我在每个 Order 对象中找到的 cust_* 字段创建一个 Customer 对象?
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.
}
有没有什么好方法可以从连接的行同时创建一个 Order 和一个 Customer 对象?或者我必须在没有表网关的情况下运行查询,获取原始结果集,然后将每个字段一一复制到新创建的对象中?