在Yii(或任何支持ORM的框架)中放置SQL查询的位置?

时间:2012-09-27 14:11:25

标签: php activerecord orm yii

对于使用MVC架构的项目,这是一个更多的编码风格问题。

我正在使用Yii框架开展项目。每个数据库表都有自己的模型类,让我可以利用Yii的Active Record。凉。

但是现在我需要使用复杂的逻辑进行SQL查询,并且需要连接许多表。 执行此操作的最佳和最快方法是编写原始SQL并将其放入某个getSomeComplexLogicData方法中。

问题是,我在哪里放这个方法?将它放在我正在调用它的控制器中是一个好习惯(在其他地方重新使用它的可能性很小),还是应该把它放在一个最适合它的Model类中?

2 个答案:

答案 0 :(得分:4)

Yii的“模型”并非强制要求CActiveRecord

您可以创建一个简单的domain object,其中包含代码中某些结构的业务逻辑,并且该结构具有单独的mapper,其中包含复杂的SQL查询。

你应该尽量避免将所有内容集中在一个类中,因为你最终会遇到SRP违规行为,这是主动记录模式通常被认为是有害的主要原因之一(当然,有些是例外)。它将机器人域逻辑和存储逻辑结合在单个类上,因此很难进行测试和维护。


如果您使用的是适当的MVC或MVC设计模式,那么就没有“模型”。模型是supposed to be一层。不是一个类或对象。并且您不应该将任何域业务逻辑暴露给控制器。

答案 1 :(得分:2)

1)您可以将此方法放入components / Controller.php中,以便此方法可用于您的每个应用程序控制器。

2)最好的方法是制作自己的组件。您可以从控制器,模型,视图中调用您的组件。

Yii::app()->yourcomponentname->methodname

了解如何制作组件的链接:http://www.yiiframework.com/wiki/187/how-to-write-a-simple-application-component/