php zend 脱离,php – 自动连接表而不破坏Zend Framework中的默认行为

我在Zend Framework中设计并实现了表关系功能.

我的第一个评论是你不会使用findDependentRowset() – 如果Action有一个对User的外键引用你会使用findParentRow().

$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’还是’Wil​​liam’?如果是’Wil​​liam’,这是否意味着保存第1行必须在此结果集的所有其他行中自动将’Bill’更新为’William’?或者是否意味着save()会自动重新运行SQL查询以从数据库中获取刷新的结果集?如果查询很耗时怎么办?

还要考虑面向对象的设计.每一行都是一个单独的对象.在一个对象上调用save()是否适合在单独的对象中更改值(即使它们是同一对象集合的一部分)是否合适?这对我来说似乎是一种形式的Content Coupling.

上面的示例是一个相对简单的查询,但也允许更复杂的查询. Zend_Db无法分析查询,旨在通过只读结果告知可写结果.这也是MySQL视图无法更新的原因.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值