具有继承关系的实体

Entity with inheritance on relationship

我想在 Symfony 4 中通过特征使用继承来将新列添加到 2 个不同的表中。

这是我想要的那两个表的结构:

这是我尝试过的: Class ManagerChildAManagerChildB 除了名字

是一样的
/**
 * @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;