0

我使用实现 Active Record 模式的yii框架作为 ORM 基础。它有 CActiveRecord 类,它是一个表包装类,具有反映表列的属性。所以这个类的每个对象代表一个数据库行。

Wiki谈到 Active Record 模式:

活动记录是一种访问数据库中数据的方法

数据库表或视图被包装到一个类中。因此,对象实例与表中的单行相关联。

到目前为止,一切都很好。

但是,例如,我应该将检索统计数据的复杂原始 sql 查询放在哪里?

而且,更一般地说,我应该将检索一些不能作为活动记录对象的数据(例如通过聚合查询检索的数据)的方法放在哪里,或者如果我故意不想检索一个对象而是一个数组,例如?

4

4 回答 4

1

对于复杂的查询,您可以随时使用 DAO: http ://www.yiiframework.com/doc/guide/1.1/en/database.dao

但在大多数情况下,CDbCriteria 会满足您的需求,您可以在此处阅读更多信息: http ://www.larryullman.com/2013/07/24/using-cdbcriteria-in-the-yii-framework/

于 2013-09-13T11:26:27.090 回答
0

有很多可能性取决于你想要什么。Yii 具有访问相关对象的关系,其中一种关系类型是统计关系,请查看此链接: http ://www.yiiframework.com/doc/guide/1.1/en/database.arr#statistical-query

您还可以使用命名范围来过滤一些结果,然后调用例如count函数来检索过滤结果的数量(这将通过发送select count(*) ...到数据库服务器而不是获取所有条目来完成,因此非常方便)。检查命名范围: http ://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes

如果统计数据与您的模型相关,例如某个客户的总支出(尽管这可以使用统计关系轻松完成),您可以将公共函数直接添加到您的模型类中,例如

public function getTotalSpending() {
    return 0; // or whatever you need to calculate here
}

最后,将业务逻辑直接映射到表不被认为是一种好的做法。相反,通过子类CModelCFormModel类创建模型并添加检索/修改数据的公共方法(可能使用其他继承CActiveRecord类的模型)。

于 2013-09-13T10:47:16.680 回答
0

使用CArrayDataProvide

原始数据数组中的元素可以是对象(例如模型对象)或关联数组(例如 DAO 的查询结果)。确保将 keyField 属性设置为唯一标识数据记录的字段的名称,如果没有这样的字段,则设置为 false。

来源:http ://www.yiiframework.com/doc/api/1.1/CArrayDataProvider

于 2013-09-13T10:47:25.223 回答
0

永远不要使用 Active Record 模式。

于 2013-09-22T22:24:37.777 回答