【问题标题】:Where to put sql queries in Yii (or any framework with ORM support)?在 Yii(或任何支持 ORM 的框架)中放置 sql 查询的位置?
【发布时间】:2012-09-27 14:11:24
【问题描述】:

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

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

但现在我需要使用复杂的逻辑和很多要连接的表进行 SQL 查询。 最好和最快的方法是编写一个原始 SQL 并将其放入 somegetSomeComplexLogicData 方法中。

问题是,我把这个方法放在哪里?将它留在我调用它的控制器中是一种好习惯(它极不可能在其他任何地方重复使用),还是应该将它放在最对应的某个模型类中?

【问题讨论】:

    标签: php activerecord orm yii


    【解决方案1】:

    Yii 的“模型”不强制扩展CActiveRecord

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

    您应该尽量避免将所有内容集中在一个类中,因为您最终会遇到SRP 违规,这是通常认为活动记录模式有害的主要原因之一(当然,也有一些例外) .将 bot 域逻辑和存储逻辑结合在单个类上会产生缺陷,因此难以测试和维护。


    如果您使用的是正确的 MVC 或受 MVC 启发的设计模式,就不会有“模型”。模型是supposed to be一层。不是类或对象。而且您不应该将任何域业务逻辑暴露给控制器。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 2022-01-04
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多