php - 在不破坏 Zend Framework 中的默认行为的情况下自动连接表

标签 php zend-framework

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

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

我考虑过在我的模型中创建自定义 fetchAll()fetchRow()find() 方法,但这会破坏默认设置行为。

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

最佳答案

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

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

上面的示例是一个相对简单的查询,但也允许进行更复杂的查询。 Zend_Db 无法分析查询以区分可写结果和只读结果。这也是 MySQL View 不可更新的原因。

关于php - 在不破坏 Zend Framework 中的默认行为的情况下自动连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/234785/

相关文章:

PHP $_COOKIE 未完全填充

php - Zend 框架 : How to retrieve the id of the last inserted row?

php - 使用 Zend_Auth 保护所有 Controller

php - 上传最小图片宽度和高度

php - 如何让 Aptana 在 .php 文件中显示 Laravel 语句颜色(支持 Laravel)?

php - 如何确定数据是在 PHP 中增加还是减少

php - Blade 不显示部分

http - 使用 Zend Framework 获取 Cookie 值

zend-framework - Zend_Test - 在 PHPUnit 的 Controller 插件中设置重定向

PHP 7.1 用动态变量替换多个值