Php 数据映射器,仅用于CRUD操作?
我最近开始阅读有关数据映射器的文章,我发现的所有文章都只演示CRUD操作,如:Php 数据映射器,仅用于CRUD操作?,php,oop,datamapper,dao,Php,Oop,Datamapper,Dao,我最近开始阅读有关数据映射器的文章,我发现的所有文章都只演示CRUD操作,如: $user = new User('John', 'Joe', 'john@hotmail.com'); $userMapper->insert($user); // or this... $user = $userMapper->fetchById(239); 他们当然应该做得更多 目前在我的应用程序中,我使用DAO(或类似的东西),因此,例如,当我需要一个$user对象时,我的一个工厂创建了一个$
$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->setNumActiveOrders($userMapper->getNumActiveOrders($userId));
是这样吗
如果我想在我的$user
对象中设置该值,我必须执行以下操作:
$userMapper->getNumActiveOrders($userId);
$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));
与使用数据映射器相比,使用DAO的实现似乎要快得多,使用的代码也更少,但我可能是错误地实现了数据映射器
任何建议都很好,谢谢
经过大量阅读,我的实现似乎是错误的,因为域对象不应该知道DAO,反之亦然。我是对还是错
这是正确的
如果这样做是错误的,那么我假设数据映射器必须用于CRUD操作以外的操作
一个计划的目的。由于对象图通常不像关系数据库系统中的数据那样结构化,因此需要某种映射器将关系数据从数据库中获取到对象中,反之亦然。数据映射者试图解决这个问题
因此,如果我想知道一个用户有多少活动订单,我可以做如下操作:
$userMapper->getNumActiveOrders($userId);
$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));
是这样吗
是的,你可以这样做。但是您也可以查询用户对象以获取它,例如
echo $user->getActiveOrders();
您的用户对象可能会有某种类型的数据来获取活动订单
如果我想在$user对象中设置该值,我必须执行以下操作:
$userMapper->getNumActiveOrders($userId);
$user->setNumActiveOrders($userMapper->getNumActiveOrders($userId));
不,您只需设置活动订单。这个数字可以从中推导出来。如果要在数据库中插入计数,则需要在映射器中处理
与使用数据映射器相比,使用DAO的实现似乎要快得多,使用的代码也更少,但我可能是错误地实现了数据映射器
这很正常,因为DAO只查询数据库,不做任何映射。谢谢您的回复。是“映射”这个词让我着迷。不管我看到多少例子,我仍然不能完全理解它。使用延迟加载机制是否意味着静态/全局调用?既然DAO用于查询,映射器用于映射,这是否意味着它们可以一起使用?喜欢将它们作为一个对象连接吗?@user1925055您的数据映射程序将知道DAO,因此它可以从/到数据库加载和持久化。至于延迟加载:不,您不需要静态和全局。一个可能的解决方案是为活动订单创建一个带有占位符对象的用户对象,该占位符对象将从数据库加载数据,并用映射的活动订单集合替换自身。按照我提供的链接查看更多选项。