基于Active Record模式的ORM框架中的原始aql查询

时间:2013-09-13 10:21:59

标签: php design-patterns activerecord orm yii

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

Wiki说有关活动记录模式:

  

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

  

数据库表或视图包装在一个类中。因此,对象实例绑定到表中的单个行。

到目前为止一切顺利。

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

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

4 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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类的其他模型)。

答案 2 :(得分:0)

使用 CArrayDataProvide

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

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

答案 3 :(得分:0)

不要使用Active Record模式。