Zend_Db_Table 连接查询与数据库视图

发布于 2024-12-20 13:33:09 字数 1503 浏览 1 评论 0原文

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

当前结构如下

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

我的数据访问层由 Zend_Db_TableZend_Db_TableRowset 组成每个表都有一个 Zend_Db_TableRow

我的业务逻辑存储在基于 table 命名的模型中

有问题的查询示例:

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

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

我的选择(本示例中使用 getName() 进行简化,但它可以是任何处理):

  • 在用户表中的角色表上进行自定义联接,这将返回一个索引数组 由关联数组组成。在这种情况下,我无法调用 Model_DbTable_User 中定义的 getName() 函数来构建名称(名字 + 中间名 + 姓氏)。即使我将数组“转换”为 Zend_Db_Table_Rowset (或我的自定义 table_rowset),我也无法访问我的自定义类方法,因为我得到了一个通用的 Zend_Db_Table_Row 对象。

  • 进行自定义联接,但在运行时在查询中使用 CONCAT() 构建名称,我仍然得到一个数组,但名称已构建,因此我不需要 getName( ) 方法。但是,如果我有特定的逻辑要应用,我就会陷入困境。

  • 创建一个视图,连接数据库中的 userrole 表,并创建一组新的 Zend_DbTableZend_DbTableRowsetZend_DbTableRow。这样我就可以在我的数据库堆栈中拥有特定的逻辑。

  • ORM(推进或主义(1 或 2)),我对此没有经验,我可能需要更多信息才能做出正确的选择。

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

即: 一路数组:

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

一路对象

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

I was wondering what would be the best practices and the best way to achieve consistency while accessing your database data :

Current structure goes as follow

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

My data access layer is composed of a Zend_Db_Table, Zend_Db_TableRowset and a Zend_Db_TableRow for each table.

My business logic is stored in the model named based on a the table

Example of problematic query :

I want to get a specific user based on his username. To do so I have a user table and a role table (role.id is referred as role_id in the user table).

I don't want to have to use the findDependentRowset that will run additionnal queries for each row that get returned. (will get problematic in data grid that display the data as many rows can be returned).

The choices I have (getName() is used in this example to simplify, but it can be any processing) :

  • Make a custom join on the role table in the user table which will return an index array composed of associative array. In that case I can't call my getName() function defined in my Model_DbTable_User to build the name (first name + middle + last name). Even if I "cast" my array to a Zend_Db_Table_Rowset (or my custom table_rowset) I can't access my custom class method since I get a generic Zend_Db_Table_Row object.

  • Make a custom join but build the name using CONCAT() in my query at runtime, I still get an array but the name is build so I don't need the getName() method. But if I have specific logic to apply i'm stuck.

  • Make a view joining user and role tables in my database and create a new set of Zend_DbTable, Zend_DbTableRowset and Zend_DbTableRow. This way I can have specific logic in my database stack.

  • An ORM (propel or doctrine (1 or 2)), I have no experience with these, I might need more informations to make the right choice.

My alternate goal is to be sure I get consistency in my data structures

ie:
array all the way :

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

object all the way

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

溺孤伤于心 2024-12-27 13:33:09

无论如何,都应该创建一个视图,因为它对其他想法的补充大于与它们的竞争。该视图将:

  • 将数据库抽象为您可以更轻松地使用的内容。
  • 更快,因为没有解析。
  • 可在应用程序外部访问。

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

Creating a view should be done regardless because it complements the other ideas more than it competes with them. The view will:

  • Abstract the database to something that you can more easily work with.
  • Be faster because there's no parsing.
  • Be accessible outside of your application.

Once you've created the views, you can choose a strategy that best solves the problem. If you're creating a form that represents a single entity, then an ORM is probably a good fit. But if you're displaying large lists of data or generating reports that contain many entities then using a declarative language like SQL is probably easier and would perform better.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文