我正在寻找完全支持基于复合主键和外键的复合(多列)关系的PHP5 ORM。
我希望Doctrine 2可以解决这个问题,但事实并非如此。它是关系数据建模的基本功能,但我所知道的PHP ORM软件都不支持它。
我最近发现SQLAlchemy有完全支持,但我需要PHP的东西,而不是Python。
答案 0 :(得分:4)
当您从数据库角度接近应用程序时,类似于Doctrine2(PHP)或Hibernate(Java)的应用程序是“派生”的,这是不合适的。当你想要反过来时,这些更适合(即“我有一个OO域模型并需要在关系数据库中持久化”,而不是“我有一个关系数据库,并且需要一个(生成的?)OO接口对于它,没有在数据库方面做任何妥协“)。如果你使用它们尽管方法中存在这些重要差异,并且你比对象模型更喜欢你的关系模式,那么你会感到沮丧。
区分不同类别的ORM工具非常重要,因为它们倾向于关注不同的开发模型。
也许试用Propel或RedBeanPHP,它似乎适合数据库驱动的开发模型,几乎没有映射,只是简单生成(通常是愚蠢的)“数据对象”而不是很多抽象。外键字段只是直接放在这些解决方案等对象中,因此它们可能“支持”您想要的所有复合材料。
像Doctrine2或Hibernate这样的解决方案不鼓励使用复合键,因此只支持它们达到一定水平(Hibernate相当远,但不建议使用它们)。
就我个人而言,我不是复合键的粉丝(除了没有附加数据的纯多对多链接表),因为我倾向于从应用程序/域模型/对象端更多地处理事物即使底层映射技术支持它们,映射到对象的复合键通常也很难处理。代理键(或至少单字段自然键)使事情变得更加简单。我不是关系数据库规范化的拜物教,从我的观点来看,“更好的表现”是非常值得怀疑的。如果您在系统中遇到真正的性能问题,保存偶尔的连接将无法保存您。
答案 1 :(得分:1)
Doctrine 2.1完全解决了这个问题。
答案 2 :(得分:0)
来自Doctrine2参考:
Doctrine 2允许使用复合 主键。但有一些 反对使用单一的限制 标识符。使用了 @GeneratedValue注释只是 支持简单(非复合) 主键,这意味着你只能 如果生成,则使用复合键 主键自己以前的价值观 调用EntityManager#persist()就可以了 实体。
指定复合主键/ 标识符,只需输入@Id标记即可 关于组成的所有字段的注释 主键。
答案 3 :(得分:0)
您可以尝试使用PHP 5编写的LEAP ORM。它可以在https://github.com/spadefoot/kohana-orm-leap的github上找到。
Leap ORM完全支持主键和外键的复合键。同样,它适用于非整数主/外键。在ORM模型中,您可以创建字段别名,字段适配器和关系。
虽然它是为Kohana PHP Framework编写的,但只需在代码中添加一个简单的自动加载功能,就可以轻松地使它适用于任何PHP框架。 Leap适用于以下数据库:DB2,Drizzle,Firebird,MariaDB,MS SQL,MySQL,Oracle,PostgreSQL和SQLite。它还提供查询构建器和数据库连接池。
在ORM的网站上,有很多好的examples and tutorials可以帮助您了解如何使用它。