Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何根据上下文为可能指向不同表的外键设置原则关系?_Php_Mysql_Database Design_Doctrine_Foreign Keys - Fatal编程技术网

Php 如何根据上下文为可能指向不同表的外键设置原则关系?

Php 如何根据上下文为可能指向不同表的外键设置原则关系?,php,mysql,database-design,doctrine,foreign-keys,Php,Mysql,Database Design,Doctrine,Foreign Keys,我正在创建一个应用程序,使用PHP、MySQL和Doctrine v1.2构建,该应用程序处理项目的有序分组,可以包含不同类型的项目。例如,我上次度假的小组可以有图像、视频和文字说明。这些项目可以排序,以便它们按照最终用户指定的顺序显示 每种不同类型的项目都有自己的属性。图像可能有标题,视频可能有指向youtube URL的链接,等等。项目可能存在于多个分组中。例如,在“我上次度假”和“酷车”的分组中,可能存在相同的船图像 我正在寻找用条令关系实现上述场景的最佳方法,以及如何在YAML模式文件中

我正在创建一个应用程序,使用PHP、MySQL和Doctrine v1.2构建,该应用程序处理项目的有序分组,可以包含不同类型的项目。例如,我上次度假的小组可以有图像、视频和文字说明。这些项目可以排序,以便它们按照最终用户指定的顺序显示

每种不同类型的项目都有自己的属性。图像可能有标题,视频可能有指向youtube URL的链接,等等。项目可能存在于多个分组中。例如,在“我上次度假”和“酷车”的分组中,可能存在相同的船图像

我正在寻找用条令关系实现上述场景的最佳方法,以及如何在YAML模式文件中表示这些关系

在我的PHP代码中,能够执行以下操作将非常棒:

$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:
        ...
      
      就这样