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ừ đó Video
và Image
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 để Content
và Media
bảng để phân biệt giữa Gallery
, Video
và Image
. Content
sử dụng JOIN inheritance
và Media
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
, width
và height
, cộng với bitrate
và duration
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?
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? –
Bạn có thể xem bài kiểm tra của tôi tại đây: https://github.com/paulandrieux/MultipleInheritanceSandbox –