我在 Zend Framework 中设计并实现了表关系特性。
我的第一条评论是findDependentRowset()
无论如何你都不会使用——findParentRow()
如果 Action 有对 User 的外键引用,你会使用。
$actionTable = new Action();
$actionRowset = $actionTable->fetchAll();
foreach ($actionRowset as $actionRow) {
$userRow = $actionRow->findParentRow('User');
}
编辑: 在循环中,您现在有一个 $actionRow 和一个 $userRow 对象。您可以通过更改对象字段并调用对象,通过任一对象将更改写回数据库save()
。
您还可以使用 Zend_Db_Table_Select 类(在我离开项目后实现)来检索基于 Action 和 User 之间的连接的 Rowset。
$actionTable = new Action();
$actionQuery = $actionTable->select()
->setIntegrityCheck(false) // allows joins
->from($actionTable)
->join('user', 'user.id = action.user_id');
$joinedRowset = $actionTable->fetchAll($actionQuery);
foreach ($joinedRowset as $joinedRow) {
print_r($joinedRow->toArray());
}
请注意,这种基于连接查询的 Rowset 是只读的。您不能在 Row 对象中设置字段值并调用save()
将更改发布回数据库。
编辑:没有办法使任意连接的结果集可写。考虑一个基于上述连接结果集的简单示例:
action_id action_type user_id user_name
1 Buy 1 Bill
2 Sell 1 Bill
3 Buy 2 Aron
4 Sell 2 Aron
接下来对于 action_id=1 的行,我更改了来自 User 对象的字段之一:
$joinedRow->user_name = 'William';
$joinedRow->save();
问题:当我查看 action_id=2 的下一行时,我应该看到“Bill”还是“William”?如果是“William”,这是否意味着保存第 1 行必须在此结果集中的所有其他行中自动将“Bill”更新为“William”?或者这是否意味着save()
自动重新运行 SQL 查询以从数据库中获取刷新的结果集?如果查询很耗时怎么办?
还要考虑面向对象的设计。每行都是一个单独的对象。调用save()
一个对象是否具有改变单独对象中值的副作用(即使它们是同一对象集合的一部分)?对我来说,这似乎是一种内容耦合形式。
上面的示例是一个相对简单的查询,但也允许更复杂的查询。Zend_Db 无法分析查询以区分可写结果和只读结果。这也是 MySQL 视图不可更新的原因。