Zend_Db_Table加入了查询与数据库视图

时间:2011-12-09 16:04:52

标签: php zend-framework coding-style zend-db zend-db-table

我想知道在访问数据库数据时最佳实践和实现一致性的最佳方法是什么:

目前的结构如下

Data Access --> Business Logic --> Controller --> View

我的数据访问层由每个表格的Zend_Db_TableZend_Db_TableRowsetZend_Db_TableRow组成。

我的业务逻辑存储在基于table

命名的模型中

有问题的查询示例:

我想根据用户名获取特定用户。为此,我有一个user表和一个role表(role.id在用户表中称为role_id

我不想使用findDependentRowset来为返回的每一行运行附加查询。 (在显示数据的数据网格中会出现问题,因为可以返回多行)。

我有的选择(在这个例子中使用getName()来简化,但它可以是任何处理):

  • 在用户表格中的角色表格上进行自定义加入,这将返回由index array组成的associative array。在这种情况下,我无法调用getName()中定义的Model_DbTable_User函数来构建名称(名字+中间名+姓)。即使我"演员"我的数组到Zend_Db_Table_Rowset(或我的自定义table_rowset)我无法访问我的自定义类方法,因为我得到了一个通用的Zend_Db_Table_Row对象。

  • 进行自定义连接,但在运行时我的查询中使用CONCAT()构建名称,我仍然得到一个数组,但名称是build,所以我不需要getName()方法。但是,如果我有特定的逻辑来应用我被卡住了。

  • 制作一个视图,加入我的数据库中的userrole表,并创建一组新的Zend_DbTableZend_DbTableRowsetZend_DbTableRow。这样我就可以在我的数据库堆栈中使用特定的逻辑。

  • ORM(推进或学说(1或2)),我对这些没有经验,我可能需要更多的信息来做出正确的选择。

我的另一个目标是确保我的数据结构具有一致性

即: 阵列一路:

array(
    array(row1), 
    array(row2)
);

一直对象

$row = $rowset->current();
$row->field;

1 个答案:

答案 0 :(得分:1)

创建一个视图应该完成,因为它补充了其他想法而不是与它们竞争。视图将:

  • 将数据库抽象为您可以更轻松使用的内容。
  • 更快,因为没有解析。
  • 可在您的申请之外访问。

创建视图后,您可以选择最能解决问题的策略。如果您要创建表示单个实体的表单,那么ORM可能非常合适。但是,如果您正在显示大型数据列表或生成包含许多实体的报表,那么使用SQL等声明性语言可能更容易,并且性能会更好。