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
{
}
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