2011-09-26 29 views
7

Tôi đang cố gắng đưa ra các đề xuất Class Table Inheritance Doctrine 2 trong dự án Symfony 2 của tôi. Hãy nói rằng một có một Pizza lớp, Burito lớp và một MacAndCheese lớp đó tất cả các kế thừa từ một Thực phẩm lớp.Học thuyết 2 - Các vấn đề về mức truy cập khi sử dụng Thừa kế bảng lớp

Các Thực phẩm lớp có các cài đặt sau:

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="dish", type="string") 
* @ORM\DiscriminatorMap({"pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 
class Food { 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

Và các lớp kế thừa có các cài đặt (Pizza ví dụ):

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food_pizza") 
*/ 
class Pizza extends Food { 

Khi chạy doctrine: schema: update --force từ ứng dụng/giao diện điều khiển Symfony 2 Tôi gặp lỗi về t ông tiếp cận mức độ $ id trong con cái Thực phẩm (Pizza ví dụ), trong đó nêu nó phải được bảo vệ hoặc yếu. Tôi chưa khai báo $ id ở bất kỳ đâu trong số Pizza, vì tôi cho rằng nó sẽ được kế thừa từ Thực phẩm.

Vì vậy, tôi đã cố gắng khai báo $ id, nhưng điều đó mang lại cho tôi một lỗi, vì tôi không thể redeclare $ id. Tôi cho rằng tôi cần một số tham chiếu đến $ id từ Thực phẩm trong Pizza, nhưng tài liệu Doctrine 2 không thực sự cho tôi câu trả lời rõ ràng về điều này.

Hy vọng bạn hiểu ý tôi và có thể giúp tôi.

Trả lời

4

Rõ ràng tôi nên đã điều tra các mã được tạo bởi doctrine: generate: thực thể hơn một chút. Khi tôi bắt đầu IDE của tôi sáng nay và nhìn thấy mã một lần nữa, tôi nhận thấy rằng họ đã 'sao chép' tất cả các lĩnh vực di truyền (như $ id trong Thực phẩm, trong ví dụ trên) cho trẻ em (Pizza, trong ví dụ trên).

Vì lý do nào đó, quyết định đặt các trường này là riêng. Tôi đã thay đổi cấp truy cập theo cách thủ công thành được bảo vệ trong tất cả các lớp và tôi đã cố gắng chạy học thuyết: lược đồ: cập nhật - force một lần nữa: nó đã hoạt động!

Vì vậy, như trong nhiều trường hợp, giải pháp là một đêm ngon giấc! ;)

Nếu ai đó đi lên với một giải pháp tốt hơn và/hoặc giải thích cho vấn đề này, xin vui lòng đăng nó. Tôi rất vui khi thay đổi câu trả lời được chấp nhận.

+0

Bạn đang nói IDE của bạn là một trong những thay đổi mức truy cập trên các lĩnh vực của bạn? Đó là loại đáng sợ. Bạn sử dụng IDE nào để tôi có thể theo dõi điều đó xảy ra? – cantera

+0

@ cantera25 Nó không phải là IDE, đó là lệnh của symfony 2: generate: entity đã làm điều đó. –

+0

Cảm ơn. Nó tiết kiệm rất nhiều thời gian của tôi. –

0

Something cần lưu ý:

Mỗi Entity phải có một định danh/khóa chính. Bạn không thể tạo ra thực thể trong một hierachy thừa kế hiện tại (beta) Như một cách giải quyết trong khi tạo các phương thức cho các thực thể mới, tôi đã di chuyển ra khỏi dự án thực thể kế thừa và sau khi tạo tôi đã chuyển chúng trở lại.

source

+0

Cảm ơn, nhưng như xa như tôi có thể nói điều này thực sự là tất cả về việc tạo ra các đơn vị và tôi chỉ muốn tạo ra cơ sở dữ liệu của tôi (có lẽ những phương pháp có liên quan nội bộ trong Học thuyết 2, mặc dù tôi không biết). –

0

Có thể là bạn nên xác định @ORM \ DiscriminatorMap theo cách như vậy:

/** 
* 
.. 
* @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 

Nếu bạn so sánh mã của bạn với các mẫu từ trang web Doctrine, bạn sẽ thấy rằng họ đã thêm vào công ty mẹ đến DiscriminatorMap .

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