【问题标题】:ManyToOne relation with Doctrine against Domain Driven Design与反对领域驱动设计的学说的多对一关系
【发布时间】:2016-02-11 16:01:01
【问题描述】:

我正面临 Doctrine 关系和 DDD 的问题。

我已经搜索了很多,但没有找到合适的答案。

我们举个简单的例子:

我有一个聚合 Category 和一个聚合 Product。 我想在ProductCategory 之间建立ManyToOne 关系。

不幸的是,Doctrine 让我在 Product 中添加属性 $category。但正如 Vaughn Vernon 所说,聚合应该通过他的身份引用其他聚合,而不是聚合本身。

此外,即使我这样做,如果我不设置 $category,Doctrine 也会将 category_id 覆盖为 null

我目前唯一的解决办法,就是在映射定义中添加category_id字段,自己添加外键。

还有其他解决办法吗?

【问题讨论】:

    标签: php doctrine-orm doctrine domain-driven-design


    【解决方案1】:

    我怀疑您可能尝试使用错误的工具来完成这项工作。 Doctrine 2 是一个对象关系管理器,因此它专注于对象。如果您通读docs,您将不会发现很多关于领域驱动设计的内容。

    鉴于 Doctrine 专注于对象,那么:

    $category = $product->getCategory();
    

    非常有道理。它还很好地映射到 sql 的设计工作方式。

    如果你真的想要一个属性 Product::CategoryId 然后继续添加它。最新的 Doctrine 甚至对值对象的支持有限。

    但是,如果您想以某种方式访问​​实际的类别对象,那么您将需要以某种方式添加您自己的查询。有点使 orm 代码几乎没用,因为您将处理自己的关系。也许下拉到 pdo 或数据库访问层。

    我看过一些文章试图做你想做的事,但它们几乎不能处理最简单的情况,并且对于任何类型的生产场景都是不切实际的。特别是因为 DDD 意味着复杂的业务逻辑。

    【讨论】:

    • 似乎合法。就像 Verraes says 一样,一切都是为了权衡取舍。没有唯一的解决方案。我猜每个都有优点和缺点。我将添加教义关系。我们只需要小心不要编辑Product 中的对象。谢谢!
    【解决方案2】:

    我只需将属性categoryId 添加到Product 即可。

    所以我不能直接从Product 导航到Category,而是需要CategoryRepository 来获取相应的类别对象,如果我需要的话。

    我失去了延迟加载的便利性,但聚合被分离得干净利落。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多