2012-05-01 42 views
6

Tôi đang tìm một giải pháp cho vấn đề sau với sự kế thừa cơ sở dữ liệu bằng Doctrine 2 được xây dựng trong khung công tác Symfony 2. Đây là những gì tôi muốn làm ...Symfony 2 + Doctrine 2 + inheritance

enter image description here

Tôi muốn tạo ra hai bảng (UredniHodiny, KonzultacniHodiny) với giao diện tương tự như các lớp trừu tượng Hodiny. Đây là cách tôi đang cố gắng để làm điều đó

<?php 

// src/CvutPWT/ImportBundle/Entity/Hodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Hodiny 
{ 

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

    /** 
    * @ORM\ManyToOne(targetEntity="Osoba") 
    */ 
    protected $osoba; 

    /** 
    * @ORM\ManyToOne(targetEntity="Mistnost") 
    */ 
    protected $mistnost; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $zacatek; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $konec; 

} 


<?php 

// src/CvutPWT/ImportBundle/Entity/KonzultacniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="konzultacnihodiny") 
*/ 
class KonzultacniHodiny extends Hodiny 
{ 

} 

<?php 

// src/CvutPWT/ImportBundle/Entity/UredniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="urednihodiny") 
*/ 
class UredniHodiny extends Hodiny 
{ 

} 

Bây giờ khi tôi chạy php app/console doctrine:generate:entities CvutPWTImportBundle Symfony tạo ra tất cả các biến (chính xác hơn cột) từ lớp Hodiny như biến tin cho cả lớp trẻ. Bây giờ khi tôi đang cố tạo các bảng đó với app/console doctrine:schema:update --force, tôi nhận được lỗi là $id must be protected or weaker. Khi tôi thay đổi bảo vệ này theo cách thủ công, tôi có thể tạo các bảng nhưng chỉ có một cột (id). Nhưng đây không phải là điều tôi mong đợi. Ai đó có thể cho tôi lời khuyên nào tôi đang làm sai không?

+0

Hey, điều này làm việc như mong đợi đối với tôi. Tôi nhận được một bảng gọi là 'konzultacnihodiny' và một bảng gọi là urednihodiny' mà cả hai đều chứa 5 trường. Lưu ý Tôi cũng cần thêm hai thực thể khác vì chúng hiện đang là FK trong lớp cơ sở Hodiny. Bạn cũng nên xác nhận [loại thừa kế] nào (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html) bạn muốn sử dụng vì có nhiều hơn một. – Shane

Trả lời

8

Đây không phải là bảng kế thừa. Các lớp siêu ánh xạ chỉ là ánh xạ thừa kế. Các bảng tương ứng với các thực thể cuối cùng của bạn sẽ không được dựa vào nhau theo bất kỳ cách nào.

Nếu bạn muốn thừa kế thực bảng (bảng duy nhất hoặc bảng tham gia), sử dụng này: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

Nếu bạn vẫn muốn sử dụng các lớp học siêu ánh xạ, sau đó bạn sẽ phải đặt định nghĩa @ORM\Id trong cả hai lớp chính thức. Bạn có thể không đặt id trong các lớp siêu ánh xạ.

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