我希望在Symfony 4中使用通过特征的继承来为2个不同的表添加新列。
这是我想要的那两个表的结构:
ManagerChildA
与ChildClass具有OneToMany关系ManagerChildB
与ChildClass具有OneToMany关系ChildClass
是基本实体这是我尝试的:
类ManagerChildA
和ManagerChildB
相同,除了名称
/**
* @ORM\Entity(repositoryClass="App\Repository\ManagerChildARepository")
*/
class ManagerChildA
{
use TraitManagerChild;
...
}
/**
* @ORM\Entity(repositoryClass="App\Repository\ManagerChildBRepository")
*/
class ManagerChildB
{
use TraitManagerChild;
...
}
这是我与关系的特质:
trait TraitManagerChild
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\ChildClass", mappedBy="managerChildA|managerChildB", orphanRemoval=true)
*/
private $child;
public function __construct()
{
$this->child = new ArrayCollection();
}
...
}
这是子实体:
/**
* @ORM\Entity(repositoryClass="App\Repository\ChildClassRepository")
*/
class ChildClass
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildA|App\Entity\ManagerChildB", inversedBy="child")
* @ORM\JoinColumn(nullable=false)
*/
private $managerChild;
...
}
最简单的方法是什么?
编辑:
问题是我无法生成迁移,因为我不知道如何用一个代码在2个实体中添加关系。问题出在评论中:性状中的targetEntity
这是我想要的一对一关系(经理可以有很多孩子),但是要有一个特征:
我的英语说得不好,抱歉:/
答案 0 :(得分:0)
解决方案1:将子实体更改为每个经理都有一个关系:
/**
* @ORM\Entity(repositoryClass="App\Repository\ChildClassRepository")
*/
class ChildClass
{
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildA", inversedBy="child")
*/
private $managerChildA;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildB", inversedBy="child")
*/
private $managerChildB;
...
}
然后,根据您的要求,您需要编写检查或约束以确保该子项至少具有一个managerChild集合(也许不是两者兼有)。
解决方案2:如果您的managerChildA和managerChildB类确实很相似,那么您也可以使用table inheritance,在映射的超类中使用trait,然后更改子实体以指向映射的超类,如下所示:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildSuperclass", inversedBy="child")
* @ORM\JoinColumn(nullable=false)
*/
private $managerChild;