Tôi đang gặp sự cố với ánh xạ của mình. Tôi không thể có được nó để làm việc. Tôi có một lớp cơ sở trừu tượng như vậy:Thừa kế lớp bảng giáo lý khi một lớp con không có thuộc tính phụ
/**
* @Entity
* @Table(name="actions")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"FOO" = "FooAction", "BAR" = "BarAction", ...})
*/
abstract class AbstractAction
{
...
}
Tôi có một loạt các hành động khác nhau, tất cả đều có các trường khác nhau. Ví dụ:
/**
* @Entity
* @Table(name="actions_foo")
*/
class FooAction extends AbstractAction
{
...
}
Nhưng một trong những hành động của tôi (BarAction
) không cần bất kỳ trường bổ sung bên cạnh những cung cấp bởi AbstractAction
. Nhưng làm thế nào tôi có thể lập bản đồ đó? Tôi đã thử bỏ qua số @Table
hoặc sử dụng cùng một @Table
làm AbstractAction
nhưng không có hiệu lực.
/**
* @Entity
* @Table(name="actions")
*/
class BarAction extends AbstractAction
{
...
}
Bỏ các @Table
mang lại cho tôi một PDOException
về một bảng thiếu BarAction
. Sử dụng số @Table
của lớp cơ sở cung cấp cho tôi:
PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Vì vậy, làm cách nào để ánh xạ điều này?
Chỉnh sửa: Cho đến nay tôi đã thử hai thứ khác.
Tôi đã thử xóa @Entity
cũng như @Table
từ BarAction
với hy vọng rằng cách này sẽ không yêu cầu bảng cơ sở dữ liệu nữa. Điều đó không hiệu quả. Thay vào đó, tôi nhận được lỗi này:
Doctrine\ORM\Mapping\MappingException: Class BarAction is not a valid entity or mapped super class.
Tiếp theo, tôi cố gắng tạo ra một bảng actions_bar
trong cơ sở dữ liệu của tôi với chỉ một số nước ngoài cột then chốt id
. Sau đó tôi vẽ bản đồ số BarAction
. Điều đó hoạt động (yay!) Nhưng nó cảm thấy crufty và xấu xí để có thêm một bảng SQL mà tôi không cần gì cả.
Vì vậy, vẫn đang tìm kiếm một cách tốt hơn ...
được thêm vào kinh nghiệm 2 năm của tôi với D2 và [tài liệu] này (http://www.doctrine-project.org/docs/orm/2.0/en/reference/inheritance-mapping.html#class-table-inheritance), bạn chỉ có thể đi với một loại thừa kế. Hoặc bạn chọn kế thừa bảng đã nối và có một bảng riêng cho mỗi thực thể hoặc chọn một bảng kế thừa đơn và có tất cả các thực thể của bạn trong một bảng. (bình luận được thêm vào cho WizardZ, người chưa có đại diện để nhận xét) – Oded
Dựa trên kinh nghiệm 2 năm của tôi với D2 và tài liệu: http://www.doctrine-project.org/docs/orm/2.0/en/reference/ inheritance-mapping.html # class-table-inheritance bạn có thể chỉ đi với một kiểu thừa kế. Hoặc bạn chọn kế thừa bảng đã nối và có một bảng riêng cho mỗi thực thể hoặc chọn một bảng kế thừa đơn và có tất cả các thực thể của bạn trong một bảng. – WizardZ
@Sander: 'BarAction' của bạn có thực sự là lớp con của' AbstractAction' không? Tôi không biết nếu nó có ý nghĩa trong mô hình miền của bạn để có 'BarAction' là gốc của hệ thống phân cấp, nhưng từ một quan điểm thực hiện, điều đó sẽ giải quyết vấn đề của bạn, vì' BarAction' sẽ chỉ sử dụng các trường từ bảng cơ sở! – Benjamin