Aro*_*eel 7 php zend-framework
情况如下:我有两个模型:'动作'和'用户'.这些模型分别参考表的"动作"和"用户".
我的操作表包含一列user_id.此时,我需要概述所有操作以及分配给它们的用户.当我使用时$action->fetchAll(),我只有用户ID,所以我希望能够加入来自用户模型的数据,最好不要打电话findDependentRowset().
我想到了创建自定义fetchAll(),fetchRow()并find()在我的模型方法,但是这样会破坏默认行为.
解决这个问题的最佳方法是什么?任何帮助将不胜感激.
Bil*_*win 14
我在Zend Framework中设计并实现了表关系功能.
我的第一个评论是你不会使用findDependentRowset()- findParentRow()如果Action有一个外键引用User,你就会使用它.
$actionTable = new Action();
$actionRowset = $actionTable->fetchAll();
foreach ($actionRowset as $actionRow) {
$userRow = $actionRow->findParentRow('User');
}
Run Code Online (Sandbox Code Playgroud)
编辑: 在循环中,您现在有$ 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());
}
Run Code Online (Sandbox Code Playgroud)
请注意,基于连接查询的此类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
Run Code Online (Sandbox Code Playgroud)
对于action_id = 1的行的下一个,我更改了来自User对象的一个字段:
$joinedRow->user_name = 'William';
$joinedRow->save();
Run Code Online (Sandbox Code Playgroud)
问题:当我查看action_id = 2的下一行时,我应该看到'Bill'还是'William'?如果是'William',这是否意味着保存第1行必须在此结果集中的所有其他行中自动将'Bill'更新为'William'?或者它是否意味着save()自动重新运行SQL查询以从数据库中获取刷新的结果集?如果查询很耗时怎么办?
还要考虑面向对象的设计.每一行都是一个单独的对象.调用save()一个对象是否具有在单独的对象中更改值的副作用(即使它们是同一对象集合的一部分)是否合适?这似乎是一种内容耦合形式.
上面的示例是一个相对简单的查询,但也允许更复杂的查询.Zend_Db无法分析查询,旨在告知可读结果的只读结果.这也是MySQL视图无法更新的原因.