0

在我正在进行的一个项目中,我们使用领域驱动设计。有了这个,我们还使用了映射器和存储库模式。映射器只是粗略的操作,而存储库看起来像实体。

所以它看起来像

class UserMapper
{
    public function fetch($criteria)
    {
         // magic on the database
    }
}

class UserRepository
{
    public function getByName($name)
    {
        $this->mapper->fetch(array('name' =>  $name));
    }
}

代码不起作用,但它给出了一个大致的想法

现在我遇到了以下问题

假设我想要名称为“john”且性别为“male”的用户。存储库现在是否应该有一个函数 getByNameAndGender($name, $gender)。但是你很快就会得到很多功能,因为你需要性别、年龄和姓名等。

接下来是我发现的所有示例仅实现以下“值 == 值”。但是没有一个例子是像“value < value”或其他东西。所以我的问题是你如何实现这一点。因为我再次看到你可以制作像

getWhereHeightIsLowerThan($height)
getWhereHeightIsLowerThanOrEquals($height)
getWhereHeightIs($height)
getWhereHeightIsGreaterThan($height)
getWhereHeightIsGreaterThanOrEquals($height)

同样是 5 个函数,应该类似于 1 个函数。您如何在存储库/映射器模式中实现这一点。为了使事情更加复杂,我没有使用 SQL 数据库。但是 MongoDB,现在这应该不是一个大问题。

--

使用 eulerfx 给出的答案,我附带了以下代码

使用 Application\Specification\AbstractSpecification;

class IdIsSpecification extends AbstractSpecification
{
    /** @var  string */
    protected $id;

    /**
     * @param $id
     * @throws \InvalidArgumentException
     */
    function __construct($id)
    {
        if(!is_string($id))
        {
            throw new \InvalidArgumentException('Expects string, given ' . gettype($id));
        }

        $this->id = $id;
    }

    /**
     * @return mixed
     */
    public function getQuery()
    {
        return [
            '_id' => new \MongoId($this->id),
        ];
    }
}

我使用 php,所以我不能使用 AND 和 OR 这两个词,所以将它们重命名为 ALSO 和 OF。

此外,规范模式会查看扔给它的数据集。这对于我的需要不是最好的方法,所以我有方法 getQuery 而不是 isSatisfied。

所有查询逻辑都在规范中找到。存储库使用规范的通用函数构建,例如通过 id 获取。

映射器只是数据集的简单粗加工处理程序(fetch、fetchAll、count、insert 等)。

最后,如果我想更改数据库语言(从 mongo 语法到 sql),我只需要更改 getQuery 方法。希望它可以帮助某人

4

1 回答 1

2

您似乎正在尝试解决复杂查询中的复杂性。为此,您可以使用规范模式。使用规范模式,您将拥有一个表示查询的对象。该对象将由有关手头实体的谓词组成,例如WhereHeightIsLowerThan 3. 然后,存储库将基于此规范对象构建 SQL 查询或 MongoDB 查询。

于 2013-04-21T15:21:51.737 回答