Symfony2来自不同实体的多对一关系:扩展类的父级也保持不变
我有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类如下: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的外键,对吗 还有别的办法解决这个问题吗 编
<?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
}