[英]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。 当所有人都保存他们的编辑时,一切都搞砸了。
呃...好吧,保持这个问题非常简短:这里有什么好的做法?
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中实现数据映射器非常困难,因为您无法读取/写入受保护/私有字段。 加载和保存对象时有几个选择:
第一种方法有可能破坏新版本,并且是非常粗糙的黑客,第二种方法被认为是(非常)不好的做法。
第三种选择也被认为是不好的做法,因为您不应该为所有字段提供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.