Php 域模型MVC中的本机DB查询

Php 域模型MVC中的本机DB查询,php,model-view-controller,domain-driven-design,Php,Model View Controller,Domain Driven Design,我已经构建了一个MVC应用程序,其中的模型层包含实体、数据映射器和服务类。到现在为止,一直都还不错。但现在我有了一个控制器,它需要显示一个报告,其中包含来自多个db表的数据,与模型中的任何实体都没有关系。该报告是从一个高级MySQL查询中生成的,该查询包含连接、SUM/AVG selects。我想要的只是一个数据数组,所以可以在视图中显示 我可以在服务层中混合使用方法吗?一些方法返回实体(“getById()”),另一些方法仅从数据库查询中返回数据数组(“getAdvancedReport()”

我已经构建了一个MVC应用程序,其中的模型层包含实体、数据映射器和服务类。到现在为止,一直都还不错。但现在我有了一个控制器,它需要显示一个报告,其中包含来自多个db表的数据,与模型中的任何实体都没有关系。该报告是从一个高级MySQL查询中生成的,该查询包含连接、SUM/AVG selects。我想要的只是一个数据数组,所以可以在视图中显示

  • 我可以在服务层中混合使用方法吗?一些方法返回实体(“getById()”),另一些方法仅从数据库查询中返回数据数组(“getAdvancedReport()”)

  • 将db查询放在服务层中可以吗?如果没有,他们应该去哪里?数据映射器感觉不对,因为它的工作只是将我的实体映射到数据库,而不是检索自定义数据

  • 也许只是“编码官僚”,但我需要把这件事做好

    除了域模型的简单CRUD示例之外,在网上找不到任何其他内容

    将db查询放在服务层中可以吗?如果没有,, 他们应该去哪里

    数据库查询应始终放置在数据映射器中,因为“服务”不应知道数据来自何处

    不是真正的答案。。更像是一瓶啤酒

    对于使用数据映射器的意义,甚至对于域对象,您似乎有点困惑

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

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

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

    此外,在线报告通常是动态的。您可以对数据进行排序、过滤和其他操作。您将得到一个服务,该服务可以操作
    报表
    对象,对其应用过滤器或从所述对象提取数据。所有这些修补都是“应用程序逻辑”

    就这样。。。我的啤酒喝光了

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

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

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

    将db查询放在服务层中可以吗

    没有

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

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

    总而言之:


    服务->getMyData()>Repository->getMyData()>DB query

    好吧,这并不是我想要的答案say@Matthieu有时候,一个更抽象的答案比直接回答更有价值是的,我对此有点困惑,但你的回答让我有点聪明这个问题的底部是MVC标签。。。您在谈论SOA。@tereško他在问题中谈论的是DDD和服务。我说的不是SOA,而是DDD。不要返回数据数组,返回可以迭代的数据。@hakre不能迭代数组吗?当然,他可以将数据封装到他喜欢的任何类中,但数组或数据对我来说似乎也很好。@tereško问题的重点是Mysql数据库域还是模型域模型?