Php 如何根据上下文为可能指向不同表的外键设置原则关系?
我正在创建一个应用程序,使用PHP、MySQL和Doctrine v1.2构建,该应用程序处理项目的有序分组,可以包含不同类型的项目。例如,我上次度假的小组可以有图像、视频和文字说明。这些项目可以排序,以便它们按照最终用户指定的顺序显示 每种不同类型的项目都有自己的属性。图像可能有标题,视频可能有指向youtube URL的链接,等等。项目可能存在于多个分组中。例如,在“我上次度假”和“酷车”的分组中,可能存在相同的船图像 我正在寻找用条令关系实现上述场景的最佳方法,以及如何在YAML模式文件中表示这些关系 在我的PHP代码中,能够执行以下操作将非常棒:Php 如何根据上下文为可能指向不同表的外键设置原则关系?,php,mysql,database-design,doctrine,foreign-keys,Php,Mysql,Database Design,Doctrine,Foreign Keys,我正在创建一个应用程序,使用PHP、MySQL和Doctrine v1.2构建,该应用程序处理项目的有序分组,可以包含不同类型的项目。例如,我上次度假的小组可以有图像、视频和文字说明。这些项目可以排序,以便它们按照最终用户指定的顺序显示 每种不同类型的项目都有自己的属性。图像可能有标题,视频可能有指向youtube URL的链接,等等。项目可能存在于多个分组中。例如,在“我上次度假”和“酷车”的分组中,可能存在相同的船图像 我正在寻找用条令关系实现上述场景的最佳方法,以及如何在YAML模式文件中
$group = new Group();
$item1 = new Image();
$item1->caption = 'my caption'
$item2 = new Video();
$item2->url = 'youtube.com/1234';
$group->Items[0] = $item1;
$group->Items[1] = $item2;
$group->save();
这可能吗?如果没有,是否有其他方法可以达到类似的结果 据我所知,这是不可能的。此外,我不能将图像、视频和文本视为单一实体。它们肯定是不同的实体。“最后一个假期”组实际上可以是一组子组“最后一个假期-视频”、“最后一个假期-图像”、“最后一个假期-文本”。这对您方便吗?您的问题不在于条令,而在于数据库设计。外键总是从一个表指向另一个表。条令只是将这种关系映射到你的对象中 对于您的示例,我建议您为“条目”创建一个表/类,该表/类可以包含任何类型的媒体。只需为“TextBody”、“ImageFile”、“VideoFile”等添加字段。。。去那个班 然后,这些“条目”需要一个外键指向您的“组”,您就完成了 这样,您就可以拥有视频,例如包含额外的文本描述和预览图像。在一个单一的对象中
也许这种方法需要进一步规范化,但这取决于数据库设计的其余部分。您可以在数据库设计中使用超类型/子类型来避免该问题。为图像、视频、注释创建超类型,然后链接到该超类型 以下是几个链接,指向几个与模型类似的问题/答案:
- 你需要的是教义的继承特性。如果您从同一基类继承图像和视频,则可以按照您想要的方式使用它
例如:
Asset:
columns:
group_id: { integer(20) }
relations:
Group: { class: Group, local: group_id, foreignAlias: Assets }
actAs:
Timestampable: ~
Video:
columns:
url: { type: string(1024) }
inheritance:
extends: Asset
type: column_aggregation
keyField: type
keyValue: video
Image:
columns:
caption: { type: string(255) }
inheritance:
extends: Asset
type: column_aggregation
keyField: type
keyValue: image
Group:
...
就这样