gpt4 book ai didi

php - 数据映射器通常是什么样子的?

转载 作者:可可西里 更新时间:2023-11-01 12:29:33 24 4
gpt4 key购买 nike

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

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

为此,也许非常了解这种模式的人可以给我一些有用的建议?我觉得只提供 update()、delete()、save() 等函数有点太简单了。

我意识到 Data Mapper 有这个问题:首先创建 Cat 的实例,然后初始化所有变量,如 name、furColor、eyeColor、purrSound、meowSound、attendants 等。所有设置完成后,调用继承自 CatDataMapper 的 save() 函数。这很简单 ;)但现在,真正的问题是:您在数据库中查询猫,并返回一个包含大量猫数据的无聊结果集。

PDO 具有一些 ORM 功能来创建 Cat 实例。可以说我使用它,或者甚至可以说我有一个 mapDataset() 函数,它接受一个关联数组。但是,一旦我从数据集中获得我的 Cat 对象,我就有了冗余数据。同时,二十个用户可以从数据库中获取相同的猫数据并编辑猫对象,即重命名猫并保存()它,而另一个用户仍在设置另一个 furColor。当所有人都保存他们的编辑时,一切都变得一团糟。

错误...好吧,让这个问题非常简短:这里有什么好的做法?

最佳答案

来自 DataMapper in PoEA

The Data Mapper is a layer of software that separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other. With Data Mapper the in-memory objects needn't know even that there's a database present; they need no SQL interface code, and certainly no knowledge of the database schema. (The database schema is always ignorant of the objects that use it.) Since it's a form of Mapper (473), Data Mapper itself is even unknown to the domain layer.

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

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

除此之外,它是更复杂的模式之一(在 PoEA 中涵盖 15 页),通常与 Repository pattern 结合使用。除其他外。查看本页右侧的相关问题列以了解类似问题。

至于您关于多个用户编辑同一个 Cat 的问题,这是一个名为 Concurrency 的常见问题.一种解决方案是 locking the row , 而有人编辑它。但就像一切一样,这可以 lead to other issues .

关于php - 数据映射器通常是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com