与映射的超类的关联映射

Emi*_*lie 15 php symfony doctrine-orm

在我的供应商包中,我有2个映射的超类:BaseSite和BaseSection(它们是抽象的).

在我的应用程序包中,我有2个实体扩展了2个映射的超类.到目前为止一切正常:我可以访问超类中定义的字段,如果需要,我可以在我的应用程序包中添加新的字段.

问题是当我试图定义这些实体之间的关联映射时.(BaseSection和BaseSite之间的manyToOne).如果我在BaseSection映射的超类中定义它,我可以运行该命令app/console doctrine:generate:entities AcmeDemoBundle,但是当我尝试创建表时它不起作用:( 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
Run Code Online (Sandbox Code Playgroud)

如您所见,它尝试在不存在的表上引用外键(BaseSite而不是Site).我猜这是因为映射的超类不知道应用程序实体中定义的表名.

我可以在应用程序实体上定义关联映射,但这意味着如果有人想使用我的包,他将不得不自己定义映射,我想避免.

还有另一种方法可以做到这一点,或者我可能只是遗漏了什么?

这是我的代码:

供应商:

文件:vendor\bundles\Acme\DemoBundle\Resources\config\doctrine\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
    // ...
Run Code Online (Sandbox Code Playgroud)

文件:vendor\bundles\Acme\DemoBundle\Resources\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
Run Code Online (Sandbox Code Playgroud)

应用:

文件:src\Application\Acme\DemoBundle\Resources\config\doctrine\Site.orm.yml

Application\Acme\DemoBundle\Entity\Site:
  type: entity
  table: Site
Run Code Online (Sandbox Code Playgroud)

文件:src\Application\Acme\DemoBundle\Entity\Site.php

<?php

namespace Application\Acme\DemoBundle\Entity;

use Acme\DemoBundle\Entity\BaseSite;

class Site extends BaseSite
{
}
Run Code Online (Sandbox Code Playgroud)

文件:src\Application\Acme\DemoBundle\Resources\config\doctrine\Section.orm.yml

Application\Acme\DemoBundle\Entity\Section:
  type: entity
  table: Section
Run Code Online (Sandbox Code Playgroud)

文件:src\Application\Acme\DemoBundle\Entity\Section.php

<?php

namespace Application\Acme\DemoBundle\Entity;

use Acme\DemoBundle\Entity\BaseSection;

class Section extends BaseSection
{
}
Run Code Online (Sandbox Code Playgroud)

Lee*_*vis 4

阅读关于继承映射的 Doctrine 手册后,它说:

这意味着在映射的超类上根本不可能存在一对多关联

表继承功能可能值得一看。

  • 我也读过那部分。这就是为什么我做了一个 ManyToOne 关联:“由映射的超类定义的持久关系必须是单向的(仅具有拥有方)” (3认同)