2012-03-26 45 views
14

Trong gói nhà cung cấp của tôi, tôi có 2 lớp phủ được ánh xạ: BaseSite và BaseSection (là trừu tượng).Ánh xạ liên kết với siêu lớp được ánh xạ

Trong gói ứng dụng của tôi, tôi có 2 thực thể mở rộng 2 lớp phủ được ánh xạ. Mọi thứ hoạt động cho đến nay: Tôi có quyền truy cập vào các trường được xác định trong các lớp bậc trên và tôi có thể thêm các trường mới vào gói ứng dụng của mình nếu cần.

Vấn đề là khi tôi đang cố xác định ánh xạ liên kết giữa các thực thể đó. (manyToOne giữa BaseSection và BaseSite). Nếu tôi định nghĩa nó trong lớp cha BaseSection ánh xạ, tôi có thể chạy lệnh app/console doctrine:generate:entities AcmeDemoBundle, nhưng nó không hoạt động khi tôi cố gắng tạo ra các bảng: (app/console doctrine:schema:update --dump-sql)

CREATE TABLE Section (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, siteId INT DEFAULT NULL, INDEX IDX_95E06DEFFADB670C (siteId), PRIMARY KEY(id)) ENGINE = InnoDB; 
CREATE TABLE Site (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
ALTER TABLE Section ADD CONSTRAINT FK_95E06DEFFADB670C FOREIGN KEY (siteId) REFERENCES BaseSite(id) ON DELETE CASCADE 

Như bạn có thể thấy, nó cố gắng tham chiếu khóa ngoài trên một bảng không tồn tại (BaseSite thay vì Site). Tôi đoán điều này là do lớp cha được ánh xạ không biết tên bảng được xác định trong thực thể ứng dụng.

Tôi có thể xác định ánh xạ liên kết trên thực thể ứng dụng thay vào đó, nhưng điều đó có nghĩa là nếu ai đó muốn sử dụng nhóm của tôi, anh ấy sẽ phải tự xác định ánh xạ mà tôi muốn tránh.

Có cách nào khác để làm điều này hoặc có thể tôi chỉ thiếu một cái gì đó?

Đây là mã của tôi:

Vendor:

File: nhà cung cấp \ bó \ Acme \ DemoBundle \ Resources \ config \ thuyết \ BaseSite.orm.yml

Acme\DemoBundle\Entity\BaseSite: 
    type: mappedSuperclass 
    fields: 
    id: 
     type: integer 
     id: true 
     generator: 
     strategy: AUTO 
    name: 
     type: string 
     length: 255 
     nullable: false 
    // ... 

Tệp: nhà cung cấp \ bundles \ Acme \ DemoBundle \ Tài nguyên \ config \ doctrine \ BaseSection.orm.yml

Acme\DemoBundle\Entity\BaseSection: 
    type: mappedSuperclass 
    fields: 
    id: 
     type: integer 
     id: true 
     generator: 
     strategy: AUTO 
    name: 
     type: string 
     length: 255 
     nullable: false 
    // ... 
    manyToOne: 
    site: 
     targetEntity: Acme\DemoBundle\Entity\BaseSite 
     joinColumn: 
     name: siteId 
     referencedColumnName: id 
     onDelete: cascade 

Ứng dụng:

File: src \ Application \ Acme \ DemoBundle \ Resources \ config \ thuyết \ Site.orm.yml

Application\Acme\DemoBundle\Entity\Site: 
    type: entity 
    table: Site 

File: src \ Application \ Acme \ DemoBundle \ Entity \ Site.php

<?php 

namespace Application\Acme\DemoBundle\Entity; 

use Acme\DemoBundle\Entity\BaseSite; 

class Site extends BaseSite 
{ 
} 

File: src \ Application \ Acme \ DemoBundle \ Resources \ config \ thuyết \ Section.orm.yml

Application\Acme\DemoBundle\Entity\Section: 
    type: entity 
    table: Section 

File: src \ Application \ Acme \ DemoBundle \ Entity \ Mục.php

<?php 

namespace Application\Acme\DemoBundle\Entity; 

use Acme\DemoBundle\Entity\BaseSection; 

class Section extends BaseSection 
{ 
} 
+0

Bạn có tìm thấy bất kỳ giải pháp nào cho điều này trong khi đó không? – Trix

Trả lời

3

Sau khi đọc Doctrine manual on Inheritance Mapping nó nói:

Điều này có nghĩa rằng One-To-Nhiều hiệp hội là không thể trên một lớp cha ánh xạ ở tất cả

Nó có thể là giá trị xem xét các tính năng kế thừa bảng.

+3

Tôi cũng đã đọc phần đó. Đó là lý do tại sao tôi đã thực hiện một liên kết ManyToOne: "các mối quan hệ liên tục được xác định bởi một siêu lớp được ánh xạ phải là một chiều (chỉ với một bên sở hữu)" – Emilie

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