具有继承关系的实体
Entity with inheritance on relationship
我想在 Symfony 4 中通过特征使用继承来将新列添加到 2 个不同的表中。
这是我想要的那两个表的结构:
ManagerChildA
与 ChildClass 有关系 OneToMany
ManagerChildB
与 ChildClass 有关系 OneToMany
ChildClass
是一个基本实体
这是我尝试过的:
Class 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();
}
...
}
这是 Child 实体:
/**
* @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
in the trait
这就是我想要的 OneToMany 关系(经理可以有很多 children),但通过一个特征:
我的英语说得不是很好抱歉:/
解决方案 1:更改 child 实体,使每个经理都有一个关系:
/**
* @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;
...
}
然后根据您的要求,您需要编写检查或约束以确保 child 至少有一个 managerChild 集(也许不是两个?)。
解决方案 2:如果您的 managerChildA 和 managerChildB 类 非常相似,您也可以使用 table inheritance,使用映射超类中的特征并将 child 实体更改为指向映射的超类是这样的:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildSuperclass", inversedBy="child")
* @ORM\JoinColumn(nullable=false)
*/
private $managerChild;
我想在 Symfony 4 中通过特征使用继承来将新列添加到 2 个不同的表中。
这是我想要的那两个表的结构:
ManagerChildA
与 ChildClass 有关系 OneToMany
ManagerChildB
与 ChildClass 有关系 OneToMany
ChildClass
是一个基本实体
这是我尝试过的:
Class 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();
}
...
}
这是 Child 实体:
/**
* @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
in the trait
这就是我想要的 OneToMany 关系(经理可以有很多 children),但通过一个特征:
我的英语说得不是很好抱歉:/
解决方案 1:更改 child 实体,使每个经理都有一个关系:
/**
* @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;
...
}
然后根据您的要求,您需要编写检查或约束以确保 child 至少有一个 managerChild 集(也许不是两个?)。
解决方案 2:如果您的 managerChildA 和 managerChildB 类 非常相似,您也可以使用 table inheritance,使用映射超类中的特征并将 child 实体更改为指向映射的超类是这样的:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildSuperclass", inversedBy="child")
* @ORM\JoinColumn(nullable=false)
*/
private $managerChild;