PHP ORM具有完整的复合主/外键支持

时间:2010-11-07 20:57:47

标签: php orm key relationship composite

我正在寻找完全支持基于复合主键和外键的复合(多列)关系的PHP5 ORM。

我希望Doctrine 2可以解决这个问题,但事实并非如此。它是关系数据建模的基本功能,但我所知道的PHP ORM软件都不支持它。

我最近发现SQLAlchemy有完全支持,但我需要PHP的东西,而不是Python。

4 个答案:

答案 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可以帮助您了解如何使用它。