有人可以从以下内容中得出一个具体的例子:
http://www.urdalen.com/blog/?p=210
..显示了如何处理one-to-many
和many-to-many
关系?
我前段时间已通过电子邮件发送过作者,但未收到回复。我喜欢他的想法,但无法弄清楚如何在简单的单表关系之外实现它。
注意:我不想使用完整的ORM。我喜欢手工做我的SQL。我想改进我的应用程序代码的设计。现在,每个域对象都有自己的类,其中包含用静态方法包装的查询。它们只是返回标量,1d数组(记录)或2d数组(记录集),具体取决于查询。
答案 0 :(得分:6)
ORM的问题(阻抗不匹配,因为它被称为)恰恰与关系有关。在对象图(内存中对象)中,关系是指向其他对象的指针。在关系数据库中,关系是相反的;这使得无法在两个模型之间进行简单的映射,这就是为什么ORM如此复杂。
如果你想要靠近数据库(避免使用ORM),那么你就不应该试图去除关系。我编写datamappers的方式如下:
$car42 = $car_gateway->fetch(42);
$wheels = $wheel_gateway->selectByCar($car42);
与ORM方式相反:
$car42 = $car_gateway->fetch(42);
$wheels = $car42->selectWheels();
这意味着网关最终会出现在您的客户端代码中,但它也会使事情保持透明并且靠近数据库。
答案 1 :(得分:1)
如果您正在寻找一个简单易用的DataMapper ORM,请查看phpDataMapper。它只有PHP5和PDO的依赖,而且它非常小巧轻便。它还支持表关系和其他一些非常好的功能。
答案 2 :(得分:0)
鉴于您对汤姆答案的回应,我建议您查看Zend Framework之类的内容。它的ORM有一个接受或保留它可以分阶段实现的架构。
当我来到我现在的雇主那里时,他们有一个申请刚刚完成了几个月,但已经过了一两个先前的版本,而且当前的版本已经开发了六个月,比预期的要长。但是,代码库很乱。例如,数据库访问逻辑和业务逻辑之间没有抽象。而且,他们希望我推动网站建设新功能,扩展现有功能,并修复代码中的现有错误。为了使事情进一步复杂化,他们没有对数据输入或输出使用任何形式的卫生设施。
当我开始涉及这个问题时,我意识到我需要一个解决方案来抽象可以逐步实现的问题,因为它们显然不会完全重写。我最初的方法是编写一个自定义ORM和DAL,它将为我做繁重的工作。它工作得很好,因为它没有侵入现有的代码库,因此它允许我以不引人注目的方式将应用程序的整个部分移动到新的体系结构中。
但是,在将我们网站的大部分用户区域移植到这个新结构并在我的自定义框架上构建了一个完整的应用程序之后(其中还包括一个自定义前端控制器和mvc实现),我正在切换到Zend Framework(这是我的选择,虽然我确信其他一些框架也可以在这种情况下工作)。
在切换到Zend Framework时,我完全不关心遗留代码库,因为:
基本上,Zend Framework有一个接受或离开架构,使其在现有项目中使用变得愉快,因为新代码和重构代码不需要侵入现有代码。