Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何扩展这个简单的数据映射器?_Php_Design Patterns_Orm_Datamapper - Fatal编程技术网

Php 如何扩展这个简单的数据映射器?

Php 如何扩展这个简单的数据映射器?,php,design-patterns,orm,datamapper,Php,Design Patterns,Orm,Datamapper,有人能从以下内容中得出一个具体的例子吗: $car42 = $car_gateway->fetch(42); $wheels = $wheel_gateway->selectByCar($car42); …这说明了如何处理一对多和多对多的关系 不久前我给作者发了电子邮件,但没有收到回复。我喜欢他的想法,但除了简单的单表关系外,我不知道如何实现它 注意:我不想使用成熟的ORM。我喜欢手工编写SQL。不过,我想改进我的应用程序代码的设计。现在,每个域对象都有自己的类,这些类中充满了用静

有人能从以下内容中得出一个具体的例子吗:

$car42 = $car_gateway->fetch(42);
$wheels = $wheel_gateway->selectByCar($car42);
…这说明了如何处理一对多和多对多的关系

不久前我给作者发了电子邮件,但没有收到回复。我喜欢他的想法,但除了简单的单表关系外,我不知道如何实现它


注意:我不想使用成熟的ORM。我喜欢手工编写SQL。不过,我想改进我的应用程序代码的设计。现在,每个域对象都有自己的类,这些类中充满了用静态方法包装的查询。它们只返回标量、一维数组记录或二维数组记录集,具体取决于查询。

ORM的阻抗失配问题,正如它所说的,正是关系的问题。在内存对象中的对象图中,关系是指向其他对象的指针。在关系数据库中,关系是反向的;这使得不可能在两个模型之间进行简单的映射,这就是ORM如此复杂的原因

如果您想靠近数据库,避免使用ORM,那么就不应该试图抽象关系。我编写数据映射器的方式如下所示:

$car42 = $car_gateway->fetch(42);
$wheels = $wheel_gateway->selectByCar($car42);
与ORM方式相比:

$car42 = $car_gateway->fetch(42);
$wheels = $car42->selectWheels();

这确实意味着网关最终会出现在您的客户机代码中,但它也会使事情非常透明,并靠近数据库。

ORM的阻抗失配问题,正如它所说的,正是与关系有关。在内存对象中的对象图中,关系是指向其他对象的指针。在关系数据库中,关系是反向的;这使得不可能在两个模型之间进行简单的映射,这就是ORM如此复杂的原因

如果您想靠近数据库,避免使用ORM,那么就不应该试图抽象关系。我编写数据映射器的方式如下所示:

$car42 = $car_gateway->fetch(42);
$wheels = $wheel_gateway->selectByCar($car42);
与ORM方式相比:

$car42 = $car_gateway->fetch(42);
$wheels = $car42->selectWheels();

这确实意味着网关最终会出现在您的客户机代码中,但它也会使事情非常透明,并与数据库保持密切联系。

鉴于您对Tom答案的回答,我建议您考虑类似Zend Framework的内容。它的ORM有一个接受或离开的架构,可以分阶段实现

当我来到我现在的雇主那里时,他们有一个应用程序,这个应用程序在几个月前刚刚完成,但已经通过了一到两个以前的版本,而当前版本的开发时间比预期的要长六个月。然而,代码库很混乱。例如,数据库访问逻辑和业务逻辑之间没有抽象。而且,他们希望我推动网站向前发展,构建新功能,扩展现有功能,修复代码中现有的bug。更复杂的是,他们没有在数据输入或输出上使用任何形式的卫生设施

当我开始涉入这个问题时,我意识到我需要一个抽象关注点的解决方案,这个解决方案可以分步骤实现,因为它们显然不需要完全重写。我最初的方法是编写一个定制的ORM和DAL,为我完成繁重的工作。它工作得很好,因为它没有侵入现有的代码库,因此它允许我以一种不引人注目的方式将应用程序的整个部分移动到新的体系结构中

然而,在将我们站点的大部分用户区域移植到这个新结构中,并在我的定制框架上构建了一个完整的应用程序,该框架还包括一个定制前端控制器和mvc实现之后,我正在切换到Zend框架这是我的选择,尽管我确信其他一些框架也会在这种情况下工作

在切换到Zend框架时,我完全不关心遗留代码库,因为:

我可以构建新模型和重构 根据我的习惯建造的旧模型 框架不引人注目。 我可以重构现有的 像他们将要使用的控制器 包装在一个行为正常的类中 以与Zend一致的方式 MVC框架,使其成为 实际开始使用的小问题 Zend的前端控制器。 我们的观点已经形成 聪明,所以我不用担心 关于分离控制器和视图 逻辑,但我可以扩展 Zend框架,这样我就可以 在Smarty中呈现现有模板 在中构建新模板时 纯PHP。
基本上,Zend Framework有一个“要么接受,要么离开”的体系结构,在现有项目中使用它是一种乐趣,因为新代码和重构代码不需要侵入现有代码。

鉴于您对Tom答案的回答,我建议您考虑类似Zend Framework的东西。它的ORM有一个接受或离开的架构,可以分阶段实现

当我来到我现在的雇主那里时,他们有一份几个月前刚刚完成的申请,但已经通过了一两个以前的版本 当前版本的开发时间比预期的要长六个月。然而,代码库很混乱。例如,数据库访问逻辑和业务逻辑之间没有抽象。而且,他们希望我推动网站向前发展,构建新功能,扩展现有功能,修复代码中现有的bug。更复杂的是,他们没有在数据输入或输出上使用任何形式的卫生设施

当我开始涉入这个问题时,我意识到我需要一个抽象关注点的解决方案,这个解决方案可以分步骤实现,因为它们显然不需要完全重写。我最初的方法是编写一个定制的ORM和DAL,为我完成繁重的工作。它工作得很好,因为它没有侵入现有的代码库,因此它允许我以一种不引人注目的方式将应用程序的整个部分移动到新的体系结构中

然而,在将我们站点的大部分用户区域移植到这个新结构中,并在我的定制框架上构建了一个完整的应用程序,该框架还包括一个定制前端控制器和mvc实现之后,我正在切换到Zend框架这是我的选择,尽管我确信其他一些框架也会在这种情况下工作

在切换到Zend框架时,我完全不关心遗留代码库,因为:

我可以构建新模型和重构 根据我的习惯建造的旧模型 框架不引人注目。 我可以重构现有的 像他们将要使用的控制器 包装在一个行为正常的类中 以与Zend一致的方式 MVC框架,使其成为 实际开始使用的小问题 Zend的前端控制器。 我们的观点已经形成 聪明,所以我不用担心 关于分离控制器和视图 逻辑,但我可以扩展 Zend框架,这样我就可以 在Smarty中呈现现有模板 在中构建新模板时 纯PHP。
基本上,Zend Framework有一个“要么接受要么离开”的体系结构,在现有项目中使用它是一种乐趣,因为新代码和重构代码不需要侵入现有代码。

如果您正在寻找一个简单且可移植的DataMapper ORM,请看一看。它唯一的依赖项是PHP5和PDO,而且它非常小而且轻量级。它还支持表关系和其他一些非常好的功能。

如果您正在寻找一个简单、可移植的DataMapper ORM,请查看。它唯一的依赖项是PHP5和PDO,而且它非常小而且轻量级。它还支持表关系和其他一些非常好的功能。

谢谢您的回答。我想我会根据Troleskn的回答保留它们:如果你想靠近数据库,那么你不应该试图把关系抽象出来。我确实希望靠近DB,因为现有的查询工作得很好。因此,我只想重构PHP而不是SQL。我想我尝试了一个类似Troleskn建议的接口,它几乎就是这样,只是我没有将结果封装在一个对象中;在PHP中,将实体封装在对象中似乎有点多余,但我发现这有助于使事情更清楚。谢谢你的回答。我想我会根据Troleskn的回答保留它们:如果你想靠近数据库,那么你不应该试图把关系抽象出来。我确实希望靠近DB,因为现有的查询工作得很好。因此,我只想重构PHP而不是SQL。我想我尝试了一个类似Troleskn建议的接口,它几乎就是这样,只是我没有将结果封装在一个对象中;在PHP中,将实体封装在对象中似乎有点多余,但我发现这有助于使事情更清楚。