5

Đây là cơ sở của tôi/thực thể cha mẹ, thiết lập để con cái của nó đang sử dụng bảng của riêng mình.Thực thể thừa kế bảng đơn có thể mở rộng thực thể kế thừa bảng lớp không?

 
/** 
* @ORM\Entity 
* @ORM\Table(name="layer_object") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"service"="Service", "aircraft"="Aircraft", ...}) 
*/ 
class LayerObject {} 

Thực thể máy bay. Một đứa trẻ đơn giản đang làm tốt

 
/** 
* @ORM\Entity 
* @ORM\Table(name="aircraft") 
*/ 
class Aircraft extends LayerObject 

Thực thể dịch vụ. Một đứa trẻ phức tạp, chính nó đang sử dụng kế thừa bảng đơn.

 
/** 
* @ORM\Entity 
* @ORM\Table(name="service") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"ground"="Ground", "onboard"="Onboard"}) 
*/ 
class Service extends LayerObject {} 

Một đứa trẻ của đơn vị dịch vụ

 
/** 
* @ORM\Entity 
*/ 
class Ground extends Service {} 


app/console doctrine:schema:validate thấy không có lỗi nhưng app/console doctrine:schema:update --force chỉ sẽ không tạo bảng 'dịch vụ', một trong đó nên sử dụng bảng duy nhất thừa kế. Có vẻ như định nghĩa thực thể dịch vụ chỉ bị bỏ qua.

Chắc chắn tôi có thể tạo SQL cho bảng này bằng tay, nhưng ứng dụng sẽ phát triển và tại một số điểm tôi sẽ cần sử dụng di chuyển.

Có ai có thể chỉ cho tôi theo một số hướng không? Cảm ơn.

Tìm thấy một bản sao, nhưng không có câu trả lời cho đến nay, xem: Doctrine 2 multiple level inheritance

Edit:
Khi tôi sử dụng lớp bảng thừa kế cho cấp 2 quá (@ORM\InheritanceType("JOINED") cho đơn vị Service) nó hoạt động khá tốt. Xem: Doctrine2 Multiple level inheritance

Trả lời

4

Điều bạn đang cố gắng đạt được là không thể thực hiện với ánh xạ thuần túy.

Các tài liệu cho Class Table InheritanceSingle Table Inheritance nêu rõ:

Các @InheritanceType, @DiscriminatorColumn và @DiscriminatorMap phải được xác định trên lớp topmost đó là một phần của ánh xạ thực thể hệ thống cấp bậc.

Bạn có thể có thể làm cho công việc này bằng cách thực hiện một subscriber đến loadClassMetaDataevent rằng những thay đổi các thừa kế kiểu tự động (ví dụ: dựa trên chú thích trên của các đối tượng trẻ em).

Một số cảm hứng khác có thể được tìm thấy trong this article.

+0

Cảm ơn rất nhiều. Điều này về cơ bản có nghĩa là: 'Chọn loại thừa kế của bạn một lần ở lớp trên cùng và gắn bó với nó'. Bây giờ điều này là tốt cho ứng dụng của tôi ... – virtualize

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