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

时间:2018-05-22 17:52:31

标签: search model domain-driven-design aggregate distinct-values

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

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

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

例如,假设用户选择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聚合的属性,但远远不足以让我无法想到强制执行所有人都应该谈论的相同的属性。

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

2 个答案:

答案 0 :(得分:1)

  

我的第一个想法是创建一个完全独立的聚合,用于对上述查询或类似结果的结果进行建模..

如果您只需要查找其他聚合或其属性,则不会创建聚合。为此,您可以创建域服务,其中“域”层中定义的接口和“基础架构”层中的实现。他们的方法可能会返回Value对象(如DistinctFooProperties)甚至是完全加载的Aggregates,具体取决于它们的用途。

作为辅助节点,如果SELECT DISTINCT * FROM Foo WHERE prop1 = 'a';是唯一的,则查询DISTINCT将始终返回不同的行,包含或不包含id

答案 1 :(得分:0)

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

相关问题