ORM无法处理组合关系 - poopy

时间:2013-07-29 18:58:02

标签: orm doctrine laravel propel eloquent

所以我看过Doctrine,Propel和Eloquent,到目前为止,他们似乎并不想考虑是否存在一个中间表,这个中间表在另外两个表之间具有混合关系。

http://s14.postimg.org/uoo8xt1sx/Screen_Shot_2013_07_29_at_2_50_47_PM.png

person与personVehicle有一对多关系,personId的主键便于此。

vehicle与personVehicle有一对一关系,vehicleId的主键便于此。

到目前为止,我所有的ORM都处理过单一的关系

  1. 一对一
  2. 一对多
  3. 多对多
  4. 但不是任何两种或更多种组合。是对的吗?使用ORM或其他替代方案(如果可用的话)将这些关系(人员,车辆和相应的id转换为personVehicle)插入这些关系的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

这是一个老问题,但我偶然发现它,并认为我加了2美分...

虽然我不知道对象的确切域名,但车辆和personVehicle可能是表继承的良好候选者。这是Doctrine提供的内容:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

这里的技巧是车辆模型(表格)包含与车辆相关的所有常见字段,但是是抽象的并且从未使用过。仅使用子模型 - 在本例中为personVehicle。然后你也可以轻松添加其他儿童类车辆。

答案 1 :(得分:0)

您描述的关系是一个用户与多个车辆之间事实上的一对多关系。

如果“vehicle”和“personVehicle”之间存在“一对一”关系,那么“personVehicle”本质上是“车辆”表的扩展。如果数据库已完全填充,则在这两个表中最终会有相同数量的行,每个vehicleId都有一行。您可以使用公共vehicleId作为索引,将“车辆”和“personVehicle”表结合起来,而不会出现数据或关系歧义。

无论如何,如果你真的想以这种方式创建你的表,你可以创建三个模型,并让personVehicle成为它自己的东西。完全像你说的那样,

车辆 - (一对一)-personVehicle-(多对一)-user