gpt4 book ai didi

php - Zend : Two Objects, 一行

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:46:09 26 4
gpt4 key购买 nike

我最近开始使用 Zend Framework (1.8.4),以提供用于查看购物车网站订单的管理工具。

我想做的是从单个数据库结果行高效地创建多个模型(Zend_Db_Table_Row_Abstract)对象。

关系很简单: 一个订单有一个客户(外键 order_custid=customer.cust_id); 一个客户有很多订单。

加载订单非常简单。使用此处记录的方法:

Modeling objects with multiple table relationships in 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) 显示它们中的每一个都包含我期望的列列表,在 protected 成员中,原始字段名称为 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 对象?还是我必须在没有表网关的情况下运行查询,获取原始结果集,然后将每个字段一个一个地复制到新创建的对象中?

最佳答案

Zend_Db 不提供执行此操作的便捷方法。

假设,对从多个表派生的行使用 Facade 模式会很不错。外观类将跟踪哪些列属于每个相应的表。当您使用 setFromArray() 方法设置单个字段或一大堆字段时,外观将知道如何将字段映射到每个表的 Row 对象,并应用 UPDATE语句到受影响的表。

或者,您可以通过子类化 Zend_Db_Table_Row_Abstract 来解决未知字段的问题,更改 __set() 行为以默默地忽略未知列而不是抛出异常。

您不能让 OO 接口(interface)来做 SQL 能做的所有事情。一定有一些底线,您可以在其中确定一组合理的常见情况已被涵盖,任何更复杂的事情都应该使用 SQL 完成。

关于php - Zend : Two Objects, 一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com