繁体   English   中英

Data Mapper通常是什么样的?

[英]What does a Data Mapper typically look like?

我有一个名为Cat的表,还有一个名为Cat的PHP类。 现在我想创建一个CatDataMapper类,以便Cat extends CatDataMapper

我希望Data Mapper类提供执行ORM以及创建,编辑和删除Cat的基本功能。

为此目的,也许能够很好地了解这种模式的人可以给我一些有用的建议吗? 我觉得提供一些函数如update(),delete(),save()会有点太简单了。

我意识到数据映射器有这个问题:首先你创建了Cat的实例,然后初始化所有变量,如name,furColor,eyeColor,purrSound,meowSound,atte者等等。在设置好所有内容之后,你调用save( )函数,它继承自CatDataMapper。 这很简单;)但现在,真正的问题是:你在数据库中查询猫并获得一个包含大量猫数据的无聊结果集。

PDO具有一些ORM功能来创建Cat实例。 让我说我使用它,或者甚至说我有一个带有关联数组的mapDataset()函数。 但是,只要我从数据集中获取Cat对象,就会有冗余数据。 同时,20个用户可以从数据库中获取相同的cat数据并编辑cat对象,即重命名cat,并保存()它,而另一个用户仍然可以设置另一个furColor。 当所有人都保存他们的编辑时,一切都搞砸了。

呃...好吧,保持这个问题非常简短:这里有什么好的做法?

来自PoEA中的DataMapper

Data Mapper是一个软件层,用于将内存中对象与数据库分开。 它的职责是在两者之间传输数据,并将它们彼此隔离。 使用Data Mapper,即使存在数据库,内存中的对象也不需要知道; 他们不需要SQL接口代码,当然也不了解数据库模式。 (数据库模式总是不知道使用它的对象。)由于它是Mapper(473)的一种形式,因此数据映射器本身甚至不为域层所知。

因此,Cat不应该扩展CatDataMapper,因为这会创建一个is-a关系并将Cat绑定到持久层。 如果您希望能够以这种方式处理Cats的持久性,请查看ActiveRecord或任何其他数据源架构模式。

在使用域模型时,通常使用DataMapper。 一个简单的DataMapper只是在一个字段到字段的基础上将数据库表映射到等效的内存中类。 但是,当出现对DataMapper的需求时,通常不会有这样简单的关系。 表格不会将1:1映射到您的对象。 相反,多个表可以形成一个Object Aggregate而反之亦然。 因此, 实施CRUD方法很容易成为一个挑战。

除此之外,它是更复杂的模式之一(PoEA中包含15页),通常与Repository模式结合使用。 查看本页右侧的相关问题栏,了解类似问题。

至于你关于多个用户编辑同一个Cat的问题,这是一个称为并发的常见问题。 一个解决方案是锁定行 ,而有人编辑它。 但就像所有事情一样,这可能导致其他问题

如果依靠ORM的象学说行走 ,其基本原理是创建一个静态类会从数据库中获取的实际数据,(例如行走会造成CatPeer),然后由Peer类检索的结果将是“水合“成猫对象。

水化过程是将“无聊的”MySQL结果集转换为具有getter和setter的漂亮对象的过程。

因此,对于检索,您可以使用像CatPeer::doSelect()这样的东西。 然后,对于一个新对象,您首先要实例化它(或从数据库中检索和实例): $cat = new Cat();

插入就像执行一样简单: $cat->save(); 这相当于一个插入(或者如果对象已经存在于db中则更新...... ORM应该知道如何通过使用,例如,存在或不存在主要对象来区分新对象和现有对象键)。

在PHP <5.3中实现数据映射器非常困难,因为您无法读取/写入受保护/私有字段。 加载和保存对象时有几个选择:

  1. 使用某种解决方法,例如序列化对象,修改它的字符串表示形式,并使用反序列化将其恢复
  2. 公开所有字段
  3. 保持私密/受保护,并为每个人编写变更器/访问器

第一种方法有可能破坏新版本,并且是非常粗糙的黑客,第二种方法被认为是(非常)不好的做法。

第三种选择也被认为是不好的做法,因为您不应该为所有字段提供getter / setter,只提供需要它的字段。 您的模型从纯DDD(域驱动设计)角度“受损”,因为它包含仅由于持久性机制而需要的方法。 这也意味着现在你必须描述字段的另一个映射 - > setter方法,在字段旁边 - >表列。

PHP 5.3引入了使用反射访问/更改所有类型字段的功能:

http://hu2.php.net/manual/en/reflectionproperty.setaccessible.php

有了这个,您就可以实现真正的数据映射器,因为为所有字段提供mutator的需求已经停止。

PDO具有一些ORM功能来创建Cat实例。 让我说我使用它,或者甚至说我有一个带有关联数组的mapDataset()函数。 但是,只要我从数据集中获取Cat对象,就会有冗余数据。 同时,20个用户可以从数据库中获取相同的cat数据并编辑cat对象,即重命名cat,并保存()它,而另一个用户仍然可以设置另一个furColor。 当所有人都保存他们的编辑时,一切都搞砸了。

为了通常跟踪数据的状态并且将使用IdentityMap和/或UnitOfWork,跟踪映射实体上的所有不同操作......以及请求周期的结束,然后将执行操作。

保持答案简短:你有一个Cat的实例。 (也许它扩展了CatDbMapper,或者Cat3rdpartycatstoreMapper)你可以调用:

$cats = $cat_model->getBlueEyedCats();
//then you get an array of Cat objects, in the $cats array

不知道你用了什么,你可能会看看一些php框架,以便更好地理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM