ManyToOne 与 Doctrine 和 Domain Driven Design 的关系
ManyToOne relation with Doctrine against Domain Driven Design
我正面临 Doctrine 关系和 DDD 的问题。
我已经搜索了很多,但没有找到合适的答案。
举个简单的例子:
我有一个集合 Category
和一个集合 Product
。
我想在 Product
和 Category
之间建立 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
来获取相应的类别对象。
我失去了延迟加载的便利性,但聚合分离得很干净。
我正面临 Doctrine 关系和 DDD 的问题。
我已经搜索了很多,但没有找到合适的答案。
举个简单的例子:
我有一个集合 Category
和一个集合 Product
。
我想在 Product
和 Category
之间建立 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
来获取相应的类别对象。
我失去了延迟加载的便利性,但聚合分离得很干净。