在域驱动设计中查询聚合子集中的不同值?

Querying distinct values in Aggregate subset in Domain Driven Design?

假设我有一个聚合,Foo。该聚合由数据库中的一个简单平面 table 表示...

Foo
------------------------------
| id | prop1 | prop2 | prop3 |
| 1  | a     | b     | c     |
| 2  | a     | bb    | cb    |
| 3  | ac    | bc    | cc    |
------------------------------

现在我想在前端过滤 Foo。我有一个表单,其中 foo 的不同属性需要显示为列表并从中编辑 select。当 属性 被 selected 时,我需要查询 Foo 并找到具有 selected 属性 的行子集。然后,我需要 select 行子集中每个 属性 的不同值 select 由搜索查询编辑。

例如,假设用户选择 a 作为 prop1...

的值
SELECT DISTINCT * FROM Foo WHERE prop1 = 'a';

在 DDD 中对此建模的合适方法是什么?我的第一个想法是创建一个完全独立的聚合来对上述查询或类似查询的结果进行建模...

class DistinctFooProperties
{
  private $prop1;
  private $prop2;
  private $prop3;
  public function __construct(
    StringCollection $prop1,
    StringCollection $prop2,
    StringCollection $prop3
  ) {
    $this->prop1 = $prop1;
    $this->prop2 = $prop2;
    $this->prop3 = $prop3;
  }
  public function getProp1Possiblities() {
    return $this->prop1;
  }
  public function getProp2Possiblities() {
    return $this->prop2;
  }
  public function getProp3Possiblities() {
    return $this->prop3;
  }
}

class DistinctFooPropertiesMySQLMapper
{
  public function findBySearchObject(FooSearchjObject $fooSearch) {
    // Search and return DistinctFooProperties
  }
}

这会导致一些复杂性。 DistinctFooPropertiesFooSearchObject 将非常接近地反映 Foo 聚合的属性,但足够远以至于我想不出一个接口来强制他们都应该谈论相同的属性。

是否有解决此问题的标准方法?

My first idea was to create a completely seperate aggregate for modeling the results of the above query or those like it..

如果您只需要查找其他聚合或其属性,则不要创建聚合。为此,您可以创建领域服务,在领域层定义接口,在基础设施层实现。他们的方法可能 return 值对象(如 DistinctFooProperties)或什至完全加载的聚合,这取决于他们的目的。

作为侧节点,查询 SELECT DISTINCT * FROM Foo WHERE prop1 = 'a'; 将始终 return 不同的行,有或没有 DISTINCT 如果 id 是唯一的。

您可以使用某种 generic Specification,但根据您的上下文,将其映射到 SQL 可能或多或少会很复杂。我相信 PHP 是一种足够可塑的语言,不会太难。