具有关系继承的实体

时间:2019-11-15 13:53:21

标签: symfony doctrine-orm doctrine symfony4

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

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

  • ManagerChildA与ChildClass具有OneToMany关系
  • ManagerChildB与ChildClass具有OneToMany关系
  • ChildClass是基本实体

这是我尝试的: 类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();
    }

    ...
}

这是子实体:

/**
 * @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

这是我想要的一对一关系(经理可以有很多孩子),但是要有一个特征: enter image description here

我的英语说得不好,抱歉:/

1 个答案:

答案 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;