Symfony2来自不同实体的多对一关系:扩展类的父级也保持不变

Symfony2来自不同实体的多对一关系:扩展类的父级也保持不变,symfony,many-to-one,Symfony,Many To One,我有3个不同的类(a、B、C),它们与类D(带有一些字段)相关。由于类D从未更新,但每次保存时我都会创建一个更新版本,所以我希望D引用A,但不是相反 到目前为止还不错 问题是,我希望从D到A有这么多对一的关系,但D的另一个记录可以指B或C 我考虑创建一个基类D,包含我需要的所有公共字段,然后创建扩展了D的类Da、Db和Dc,Da、Db和Dc的唯一附加字段将是分别与a、B或C的多对一关系 我假设这将创建3个表:Da、Db和Dc,每个表都有对应于A、B、C的外键,对吗 还有别的办法解决这个问题吗 编

我有3个不同的类(a、B、C),它们与类D(带有一些字段)相关。由于类D从未更新,但每次保存时我都会创建一个更新版本,所以我希望D引用A,但不是相反

到目前为止还不错

问题是,我希望从D到A有这么多对一的关系,但D的另一个记录可以指B或C

我考虑创建一个基类D,包含我需要的所有公共字段,然后创建扩展了D的类Da、Db和Dc,Da、Db和Dc的唯一附加字段将是分别与a、B或C的多对一关系

我假设这将创建3个表:Da、Db和Dc,每个表都有对应于A、B、C的外键,对吗

还有别的办法解决这个问题吗

编辑:我的D类如下:

<?php
// src/AppBundle/Entity/Tolerance.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

    /**
     * @ORM\Column(type="integer")
     */
    protected $risk;
    /**
     * @ORM\Column(type="integer")
     */
    protected $scope;
    /**
     * @ORM\Column(type="integer")
     */
    protected $budget;
    /**
     * @ORM\Column(type="integer")
     */
    protected $schedule;
    /**
     * @ORM\Column(type="integer")
     */
    protected $benefit;

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

    /**
     * @ORM\ManyToOne(targetEntity="User")
     */    
    protected $changedBy;    


    public function __construct()
    {
        $this->timestamp = new \DateTime();
    }

// getters and setters follow
}

您的解决方案很好。但是,您可以选择继承的类型。有通常的类型(您的)、单表和类表继承。从这些类型中选择一种适合您的需要。有关更多信息,请阅读。

是否可以通过类型选择将类别A、B和C组合成单个实体?或者需要将它们用作与其他实体具有不同关系的对象?我想,如果你不能把它们结合起来,你做得对。它们可以是一个有类型选择的单一类,但我需要一个正确的“父亲”的参考。我当然可以有3个多对多关系,其中2个为空,另一个指向正确的父亲(由“类型”字段标识),但我不知道它是否值得或更易于维护……不要创建3个关系,只创建一个。公差<-OneToMany->EntityTolerance(带类型)->ManyToMany->(自我在$father中)。当你创建父亲时,你只需要检查正确的类型,或者手动设置。我不确定我是否理解它。如果你有时间,我真的希望你能给出一个更详细的答案,否则没问题,我会坚持我的解决方案。
<?php
// src/AppBundle/Entity/StageTolerance.php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Tolerance as BaseTolerance;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Entity\StageToleranceRepository")
 * @ORM\Table(name="stage_tolerances")
 */
class StageTolerance extends BaseTolerance
{

    /**
     * @ORM\ManyToOne(targetEntity="Stage")
     */    
    protected $stage;

    // getters and setters follow
}