0

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

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

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

这就是我尝试过的: Class ManagerChildAand ManagerChildBare the same except the name

/**
 * @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在特质中

这就是我想要的 OneToMany 关系(经理可以有很多孩子),但通过一个特征: 在此处输入图像描述

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

4

1 回答 1

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 类非常相似,您也可以使用 表继承,使用映射超类中的特征并将子实体更改为指向映射超类,如下所示:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\ManagerChildSuperclass", inversedBy="child")
 * @ORM\JoinColumn(nullable=false)
 */
private $managerChild;
于 2019-11-15T16:18:44.680 回答