2010-05-05 53 views
2

我开始使用Symfony,我发现了一些关于继承的文档。但也发现this discouraging article,这让我怀疑,如果教义继承处理任何好...symfony + doctrine +继承,如何让它们工作?

有没有人找到一个聪明的解决方案继承在Symfony + Doctrine?

举个例子,我已经结构化的数据库是这样的:

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”:

Poster: 
    connection: doctrine 
    tableName: poster 
    columns: 
    poster_id: 
     type: integer(4) 
     fixed: false 
     unsigned: false 
     primary: true 
     autoincrement: true 
    user_name: 
     type: string(50) 
     fixed: false 
     unsigned: false 
     primary: false 
     notnull: true 
     autoincrement: false 
    relations: 
    Post: 
     local: poster_id 
     foreign: poster_id 
     type: many 
    User: 
     local: poster_id 
     foreign: user_id 
     type: many 
    Version: 
     local: poster_id 
     foreign: poster_id 
     type: many 
User: 
    connection: doctrine 
    tableName: user 
    columns: 
    user_id: 
     type: integer(4) 
     fixed: false 
     unsigned: false 
     primary: true 
     autoincrement: false 
    real_name: 
     type: string(50) 
     fixed: false 
     unsigned: false 
     primary: false 
     notnull: false 
     autoincrement: false 
    relations: 
    Poster: 
     local: user_id 
     foreign: poster_id 
     type: one 

用户创建了这种结构与Doctrine自动生成的表单不起作用。

任何线索将不胜感激。

+0

我很困惑你想如何应用基于上述数据的继承(你原来的SQL与生成的.yml没有关联)。你能详细说明你想做什么吗? – richsage 2010-05-05 20:33:26

+0

感谢您的回答。 那么,它应该相互关联,因为它是由Doctrine生成的。我确实把它聚焦在这个问题上。我只是发现海报表的关系很奇怪,因为那些是从其他表到海报表的外部FK ... 我只是试图扩展Poster与用户,这就是为什么我让user_id成为poser_id的FK。请告诉我,如果我需要更具体。 – ismaelmachado 2010-05-06 02:04:08

+0

嗯,我现在看到了('版'的东西让我困惑)。如果你首先在.yml中编写模式,可能会更容易 - 我不明白为什么Doctrine会生成这些其他关系,除非您是从已经有FK的数据库自动生成的。 – richsage 2010-05-06 08:18:22

回答

2

经过几个月的使用列聚合和混凝土继承的项目,我只能说一件事:远离具体的继承!真。

比方说,你有3个表:从媒体继承的媒体和视频/音频。你会期望能够做到这样的事情:

Doctrine_Query::create() 
    ->from('Media m') 
    ->execute(); 

那么它不会与混凝土继承工作。这只是毫无价值,几乎没有实际用途,除了模型继承方法。

在另一方面,柱聚集,媒体表将自动的加入一个“类型”一栏,并将使你的东西,如:

Doctrine_Query::create() 
    ->from('Video v') 
    ->execute(); 

将返回一个视频对象集合。但你也可以这样做:

Doctrine_Query::create() 
    ->from('Media m') 
    ->execute(); 

而你会得到一个混合的视频和音频对象的结果。

无论如何,你应该检查doctrine documentation。 但要小心,因为继承和学说可能会很快变得麻烦。

+0

感谢您的建议,但我真的需要一个解决方案来开始开发一个项目,我设法让它工作。 问题是列聚合句柄或单个超类中的对象,我认为这是不好的数据库设计。 我很失望Doctrine在数据库级别处理继承的方式。我看到具体继承是一个不完整的方法,所以我根据它生成模型,然后修改表实现。它现在可行,让我们看看它是如何发展的。 – ismaelmachado 2010-05-15 14:53:14

0

分离“视频”的数据说,从“音频”的数据,但仍使用相同的表来存储“媒体” A方案如下:

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上面提到的那样获取它,并且在该表中仍然没有不相关的数据。当然,你必须加入它,但索引外键不应该是性能打击。