域模型MVC中的本机数据库查询

时间:2012-11-27 10:02:34

标签: php model-view-controller domain-driven-design

我有一个构建的MVC应用程序,其中包含实体,数据映射器和服务类的模型层。到现在为止还挺好。但是现在我有一个控制器需要显示一个报告,其中包含来自多个数据库表的数据,与我模型中的任何实体无关。该报告是根据包含连接,SUM / AVG选择的高级MySQL查询构建的。我想要的只是一个数据数组,所以要在VIEW中显示。

  1. 我可以在服务层中混合方法,一些返回实体(“getById()”),一些只返回数据库查询中的数据数组(“getAdvancedReport()”)?

  2. 将db-queries放在服务层中是否正常?如果没有,他们应该去哪里?数据映射器感觉不对,因为它的工作只是将我的entites映射到数据库,而不是检索自定义数据。

  3. 也许只是“编码官僚机构”,但我需要这样做。

    除了域模型的简单CRUD示例外,无法在网上找到任何内容。

3 个答案:

答案 0 :(得分:4)

  

不是真的答案..更像是带瓶啤酒的pontifications

对于拥有数据映射器甚至是域对象的观点,你似乎有点困惑。

数据映射器负责存储(有时是SQL数据库)和域对象之间的信息交换。如果您甚至有一个规范化的数据库结构,则数据库实体和域对象将不会映射1:1。映射器是针对特定域对象而不是针对数据库表。单个域对象甚至可以有多个映射器(例如:一个映射器在DB中存储数据,一个在会话中)。

如果您的Report对象没有域逻辑,您甚至可以使用活动记录。实用的方法是在潜在域对象具有 CRUD且没有域逻辑时使用它们。如果有一些计算,坚持使用域对象+数据映射器对。

服务层用于应用程序逻辑,而不是存储逻辑。它中应该没有SQL。服务应该主要控制域对象和映射器的未确定混合之间的交互。邮件服务和类似结构除外。

此外,通常在线报告是动态的。您可以订购数据,过滤数据并进行操作。您最终会得到一个服务,它可以操作Report对象,对其应用过滤器或从所述对象中提取数据。所有这些修补都是“应用逻辑”。

  

就是这样......我的啤酒用完了

答案 1 :(得分:2)

  

我可以在服务层中混合方法,一些返回实体(“getById()”),一些只返回数据库查询中的数据数组(“getAdvancedReport()”)?

是的,但我会纠正你的句子:一些返回实体,一些只返回数据数组

=>服务的用户不关心实体/数据来自何处。所以,是的,您的服务可以返回实体原始数据(原始类型数组)。

  

将db-queries放在服务层中是否可以?

没有

  

如果没有,他们应该去哪里?

在Repository / DAO中。可以在存储库中执行本机查询。这里没有使用Data Mappers,只是因为我们不需要映射实体。

总结一下:

服务 - > getMyData()>存储库 - > getMyData()>数据库查询

答案 2 :(得分:0)

  

将db-queries放在服务层中是否正常?如果不,   他们应该去哪里?

数据库查询应始终放在数据映射器中,因为“服务”不应该知道来自哪里的数据。