如果DataMapper仅用于传输/交换数据,则在何处为集合实例化对象


Where to instantiate objects for a collection if the DataMapper is only for transfer/exchange of data?

由于DataMapper应该用于对象和关系数据库之间的数据交换/传输,所以我会得到这样的用户

$user = $this->entityFactory->build('User');
$userMapper = $this->mapperFactory->build('User');
$user->setId(43);
$userMapper->fetch($user);

这很好,因为我可以在映射器之外创建User对象并将其传递进去,但是当我获得对象的集合/列表时,我该怎么办?

首先在映射器之外创建空对象似乎不正确,并且肯定会导致一些问题,所以最好的方法是什么?

谢谢。

我不知道这个问题是否还在你的脑海里,但是让我给你一个答案。原则上,第一步是相同的

$userCollection = $this->entityFactory->build('UserCollection');
$userCollectionMapper = $this->mapperFactory->build('UserCollection');
$user = $this->entityFactory->build('User');
$user->setId(43);
$userCollection->add($user);
$userCollectionMapper->fetch($userCollection);

所以userObject将在这里作为collectionMapper的searchObject(就像teresko在旧线程中提出的那样)。你的CollectionMapper会从数据库中检索数据,我更喜欢使用像

这样的东西
//returns new User object
$newUser = $userCollection->newUser();
//populate user object with DB entry
$userCollectionMapper->populate($newUser,$DBresponse);
//add to collection
$userCollection->add($newUser);

当然,在此之前会有一个循环,遍历数据库中找到的行,并且必须在添加结果之前清除用户对象列表。这就是我处理这个问题的方法。