ManyToOne 与 Doctrine 和 Domain Driven Design 的关系

ManyToOne relation with Doctrine against Domain Driven Design

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

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

举个简单的例子:

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

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

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

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

还有其他解决办法吗?

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

鉴于 Doctrine 关注对象,那么:

$category = $product->getCategory();

很有道理。它还很好地映射了 sql 的工作原理。

如果您确实想要 属性 Product::CategoryId,请继续添加它。最新的 Doctrine 甚至对值对象的支持也很有限。

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

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

我只是想在 Product 中添加一个 属性 categoryId 就这样。

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

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