7

情况如下:我有2个模型:'Action'和'User'。这些模型分别引用表“操作”和“用户”。

我的操作表包含一列user_id。此时,我需要对所有操作以及分配给它们的用户进行概览。当我使用$action->fetchAll()时,我只有用户 ID,所以我希望能够从用户模型中加入数据,最好不要调用findDependentRowset().

我考虑过在我的模型中创建 customfetchAll()和方法fetchRow()find()但这会破坏默认行为。

解决此问题的最佳方法是什么?任何帮助将不胜感激。

4

3 回答 3

14

我在 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 视图不可更新的原因。

于 2008-10-26T01:18:51.507 回答
2

您始终可以在数据库中创建一个视图来为您执行连接。

CREATE OR REPLACE VIEW VwAction AS
SELECT [columns]
  FROM action
  LEFT JOIN user
    ON user.id = action.user_id

然后只需使用

$vwAction->fetchAll();

请记住 MySQL 中的视图是只读的(假设这是 MySQL)

于 2008-10-24T21:08:07.000 回答
1

创建视图 sql 表不是一个很好的联合解决方案吗?并在一个简单的表类之后访问它

我认为如果你的逻辑在 sql 中比在 php 中更好

于 2009-10-27T14:06:16.210 回答