Php symfony+;条令+;继承,如何让它们发挥作用?

Php symfony+;条令+;继承,如何让它们发挥作用?,php,inheritance,symfony1,doctrine,Php,Inheritance,Symfony1,Doctrine,我开始使用Symfony,我找到了一些关于继承的文档。但也发现了,这让我怀疑学说是否能处理好继承问题 有人在Symfony+学说中找到了智能继承解决方案吗? 例如,我已经构建了如下数据库: CREATE TABLE `poster` ( `poster_id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(50) NOT NULL, PRIMARY KEY (`poster_id`), UNIQUE KEY `id` (

我开始使用Symfony,我找到了一些关于继承的文档。但也发现了,这让我怀疑学说是否能处理好继承问题

有人在Symfony+学说中找到了智能继承解决方案吗?

例如,我已经构建了如下数据库:

CREATE TABLE `poster` (
  `poster_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) NOT NULL,
  PRIMARY KEY (`poster_id`),
  UNIQUE KEY `id` (`poster_id`),
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `real_name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_id` (`user_id`),
  CONSTRAINT `user_fk` FOREIGN KEY (`user_id`) REFERENCES `poster` (`poster_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
由此,条令产生了这个“schema.yml”:

用户使用自动生成的表单创建此结构不起作用


任何线索都将不胜感激。

在使用列聚合和具体继承的项目上工作了几个月后,我只能说一句话:远离具体继承!真的

假设您有3个表:媒体和从媒体继承的视频/音频。您希望能够执行以下操作:

Doctrine_Query::create()
    ->from('Media m')
    ->execute();
好吧,它不适用于具体的继承。除了模型继承方法外,它毫无价值,几乎没有实际用途

另一方面,通过列聚合,媒体表将自动添加一个“类型”列,并允许您执行以下操作:

Doctrine_Query::create()
    ->from('Video v')
    ->execute();
它将返回一个视频对象集合。但你也可以这样做:

Doctrine_Query::create()
    ->from('Media m')
    ->execute();
您将得到视频和音频对象的混合结果

不管怎样,你应该检查一下。
但要小心,因为继承和原则可能会很快变得麻烦。

将“视频”数据与“音频”数据分离,但仍使用同一个表存储“媒体”的解决方案如下:

Media:
  columns:
    name: { type: string(255), notnull: true }
    description: { type: text }

Video:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: video

Audio:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: audio

VideoData:
  columns:
    resolution_x: { type: integer, notnull: true }
    resolution_y: { type: integer, notnull: true }
  relations:
    Video: { foreignAlias: Data, onDelete: CASCADE }

AudioData:
  columns:
    sample_rate: { type: integer, notnull: true }
  relations:
    Audio: { foreignAlias: Data, onDelete: CASCADE }

像这样的事。。。通过这种方式,您可以将所有“媒体”存储在一个表中,并按照DuoSRX上面提到的方式获取它,而该表中仍然没有不相关的数据。当然,您必须加入它,但是索引外键不应该对性能造成任何影响。

我不清楚您希望如何基于上述数据应用继承(您的原始SQL与生成的.yml不相关)。你能详细说明你想做什么吗?谢谢你的回答。好吧,它应该是相关的,因为它是由教义产生的。我确实把它剪了下来,以便把重点放在这个问题上。我只是觉得海报表的关系很奇怪,因为它们是从其他表到海报表的外部FK。。。我只是想用User扩展海报,这就是为什么我把User_id设为poser_id的FK。请告诉我是否需要更具体。嗯,我现在明白了(“版本”的东西让我困惑)。如果您首先在.yml中编写模式,可能会更容易一些-我不明白为什么Doctrine会生成这些其他关系,除非您是从已经有FKs的数据库自动生成的。感谢您的建议,但我确实需要一个解决方案来开始开发一个项目,并且我设法使它工作起来。问题是列聚合在单个超表上处理或处理对象,我认为这是糟糕的数据库设计。我真的很失望,条令在数据库级别处理继承的能力有多差。我认为具体继承是一种不完整的方式,因此我基于它生成了模型,然后修改了表实现。它现在起作用了,让我们看看进展如何。
Media:
  columns:
    name: { type: string(255), notnull: true }
    description: { type: text }

Video:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: video

Audio:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: audio

VideoData:
  columns:
    resolution_x: { type: integer, notnull: true }
    resolution_y: { type: integer, notnull: true }
  relations:
    Video: { foreignAlias: Data, onDelete: CASCADE }

AudioData:
  columns:
    sample_rate: { type: integer, notnull: true }
  relations:
    Audio: { foreignAlias: Data, onDelete: CASCADE }