Mat*_*cke 5 php zend-framework zend-db-table zend-db
我最近开始使用Zend Framework(1.8.4)来提供管理工具来查看购物车网站的订单.
我想要做的是Zend_Db_Table_Row_Abstract从单个数据库结果行有效地创建多个model()对象.
关系很简单:订单有一个客户(外键order_custid=customer.cust_id); 客户有很多订单.
加载订单很简单.使用此处记录的方法:
......然后,我可以抓住每个客户.
foreach ($orderList as $o)
{
cust = $o->findParentRow('Customers');
print_r ($cust); // works as expected.
}
Run Code Online (Sandbox Code Playgroud)
但是当你加载一长串订单时 - 比方说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);
Run Code Online (Sandbox Code Playgroud)
这给了我一个订单对象数组. 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.
}
Run Code Online (Sandbox Code Playgroud)
有没有什么好方法可以从连接的行同时创建Order和Customer对象?或者我必须在没有表网关的情况下运行查询,获取原始结果集,并将每个字段逐个复制到新创建的对象中?
Zend_Db不提供执行此操作的便捷方法。
假设,对于从多个表派生的行使用外观模式会很漂亮。外观类将跟踪哪些列属于每个相应的表。当您使用该方法设置单个字段或一组字段时setFromArray(),外观将知道如何将字段映射到每个表的 Row 对象,并将UPDATE语句应用于受影响的表。
或者,您可以通过子类化来解决未知字段的问题Zend_Db_Table_Row_Abstract,将__set()行为更改为静默忽略未知列而不是抛出异常。
你不可能用一个面向对象的接口来完成 SQL 能做的所有事情。必须有一条界限,您可以确定已经涵盖了一组合理的常见情况,并且任何更复杂的事情都应该使用 SQL 来完成。
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |