Data Mapper,仅适用于CRUD操作?

时间:2013-01-02 10:44:36

标签: php oop datamapper dao

我最近开始阅读有关数据映射器的内容,我发现的所有文章都只展示了CRUD操作:

$user = new User('John', 'Joe', 'john@hotmail.com');
$userMapper->insert($user);

// or this...
$user = $userMapper->fetchById(239);

当然他们应该做更多的事情?

目前在我的应用程序中我使用DAO(或类似的东西),例如,当我需要一个$user对象时,我的一个工厂创建一个$userDAO对象并将其注入我的$user对象。并且从我的$user对象执行查询:

$this->userDAO->getNumActiveOrders($this->userId);

它将在$userDAO对象中执行查询并返回结果。

经过大量阅读后,似乎我的实现是错误的,因为域对象不应该知道DAO,反之亦然。我是对还是错?

如果这样做是错误的,那么我认为数据映射器必须用于CRUD以外的操作吗?

因此,如果我想了解用户有多少活动订单,我可以执行以下操作:

$userMapper->getNumActiveOrders($userId);

那会是正确的吗?

如果我想在$user对象中设置该值,我必须执行以下操作:

$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));

使用我的DAO实现似乎比使用数据映射器更快,使用的代码更少,但我可能错误地实现了数据映射器。

任何建议都会非常感谢。

1 个答案:

答案 0 :(得分:3)

  

经过大量阅读后,似乎我的实现是错误的,因为域对象不应该知道DAO,反之亦然。我是对还是错?

这是正确的。

  

如果这样做是错误的,那么我认为数据映射器必须用于CRUD以外的操作吗?

DataMapper is to map data from a Database to Domain Objects的目的。由于对象图通常不像关系数据库系统中的数据那样构造,因此需要某种映射器将数据库中的关系数据提取到对象中,反之亦然。 DataMappers尝试解决Impedance Mismatch

的问题
  

因此,如果我想了解用户有多少活动订单,我可以执行以下操作:

$userMapper->getNumActiveOrders($userId);
  

那会是正确的吗?

是的,你可以这样做。但您也可以查询用户对象,例如

echo $user->getActiveOrders();

然后您的用户对象可能会有某种Lazy Loading mechanism来获取有效订单。

  

如果我想在我的$ user对象中设置该值,我必须执行以下操作:

$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));

没有。您只需设置活动订单即可。这个数字可以从中得出。如果计数是您想要插入数据库中的,那么您将在Mapper中处理它。

  

使用我的DAO实现似乎比使用数据映射器更快,使用的代码更少,但我可能错误地实现了数据映射器。

这很正常,因为DAO只查询数据库而不进行任何映射。