2010-10-14 31 views
5

Tôi đang sử dụng Doctrine2 để quản lý mô hình của tôi dưới đây: Có một khái niệm trừu tượng Content với một mô hình composite trong Gallery, cũng là một khái niệm trừu tượng Media từ đó VideoImage kế thừa.Nhiều cấp độ phân biệt đối xử trong khi sử dụng Doctrine2

sự lựa chọn của tôi là thêm discriminators để ContentMedia bảng để phân biệt giữa Gallery, VideoImage. Content sử dụng JOIN inheritanceMedia sử dụng SINGLE_TABLE inheritance.

Khi tôi chạy doctrine orm:schema-tool:create --dump-sql, Media bảng đang sao chép các cột từ số Content. Đó là đầu ra của lệnh:

CREATE TABLE Content (id INT AUTO_INCREMENT NOT NULL, container_id INT DEFAULT NULL, creationDate DATETIME NOT NULL, publicationDate DATETIME DEFAULT NULL, isGallery TINYINT(1) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
CREATE TABLE Media (id INT AUTO_INCREMENT NOT NULL, creationDate DATETIME NOT NULL, publicationDate DATETIME DEFAULT NULL, width INT NOT NULL, height INT NOT NULL, isImage TINYINT(1) NOT NULL, bitrate INT NOT NULL, duration INT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
CREATE TABLE Gallery (id INT AUTO_INCREMENT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
ALTER TABLE Content ADD FOREIGN KEY (container_id) REFERENCES Gallery(id); 
ALTER TABLE Gallery ADD FOREIGN KEY (id) REFERENCES Content(id) ON DELETE CASCADE 

Dưới đây là các lớp học và các chú thích của tôi:

Content.php

/** @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="isGallery", type="boolean") 
* @DiscriminatorMap({ 
*  0 = "Media", 
*  1 = "Gallery" 
* }) 
*/ 
abstract class Content 
{ 
    /** @Id @GeneratedValue @Column(type="integer") */ 
    private $id; 
    /** @Column(type="datetime") */ 
    private $creationDate; 
    /** @Column(type="datetime", nullable="true") */ 
    private $publicationDate; 
    /** @ManyToOne(targetEntity="Gallery", inversedBy="contents") */ 
    private $container; 
} 

Media.php

/** @Entity 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="isImage", type="boolean") 
* @DiscriminatorMap({ 
*  0 = "Video", 
*  1 = "Image" 
* }) 
*/ 
abstract class Media extends Content 
{ 
    /** @Column(type="integer") */ 
    private $width; 
    /** @Column(type="integer") */ 
    private $height; 
} 

Gallery.php

/** @Entity */ 
class Gallery extends Content 
{ 
    /** @OneToMany(targetEntity="Content", mappedBy="container") */ 
    private $contents; 
} 

Video.php

/** @Entity */ 
class Video extends Media 
{ 
    /** @Column(type="integer") */ 
    private $bitrate; 
    /** @Column(type="integer") */ 
    private $duration; 
} 

Image.php

/** @Entity */ 
class Image extends Media 
{ 
} 

Tôi hỏi: Đó là hành vi có đúng không? Không nên Media chỉ có các trường id, widthheight, cộng với bitrateduration từ Video?

Ngoài ra, có cách nào để loại bỏ bảng không cần thiết Gallery không?

Tôi hy vọng tôi đã làm cho nó đủ rõ ràng, mặc dù, cảm thấy tự do để yêu cầu. Cảm ơn bạn trước.

CẬP NHẬT: Không có cách nào. Tôi đã cố gắng tìm một ví dụ đơn giản hơn không hiển thị hành vi này, nhưng tôi không tìm thấy.

Mọi đề xuất? Đây có phải là một lỗi trong Doctrine 2 hoặc tôi thiếu một giải pháp đơn giản hơn?

Trả lời

5

Tôi tự trả lời câu hỏi của mình, hy vọng nó sẽ giúp ai đó vào một ngày nào đó.

Tôi đã mở bug report in github for doctrine2 với câu hỏi này và câu trả lời khá rõ ràng: Điều này không được hỗ trợ.

CẬP NHẬT 2013/07/27

Tôi chỉ cố gắng này với học thuyết 2.3.4 và nó hoạt động như mong đợi.: D

+0

Tôi cũng có học thuyết 2.3.4 nhưng hành vi không hoạt động. Bảng Media không được tạo ra, bạn có một số phản hồi? –

+0

Bạn có thể xem bài kiểm tra của tôi tại đây: https://github.com/paulandrieux/MultipleInheritanceSandbox –

0

Nếu tất cả chúng đều trừu tượng, tôi thấy có ý nghĩa hơn khi đặt DiscriminatorMap chỉ trong thực thể cấp cao nhất.

Các vấn đề liên quan