一个实体与同一个实体有 2 个多对一关系

时间:2021-01-26 12:20:16

标签: php doctrine relationship symfony5

我正在使用 Symfony5。我有 2 个具有关系的实体:角色和婚礼。

每个角色可以有多个婚礼。 每个婚礼都与 2 个不同的角色相关。

/**
 * @ORM\Entity(repositoryClass=CharacterRepository::class)
 */
class Character
{
/**
 * @ORM\Id
 * @ORM\GeneratedValue
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\Column(type="string", length=50, nullable=true)
 */
private $firstName;

/**
 * @ORM\Column(type="string", length=50, nullable=true)
 */
private $lastName;
[...]

和婚礼:

/**
 * @ORM\Entity(repositoryClass=WeddingRepository::class)
 */
class Wedding
{
/**
 * @ORM\Id
 * @ORM\GeneratedValue
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\Column(type="string", length=4, nullable=true)
 */
private $startYear;

/**
 * @ORM\Column(type="string", length=4, nullable=true)
 */
private $endYear;
[...]
}

我尝试在婚礼实体(persona1 和 persona2)中设置 2 个不同的多对一关系,但 persona1 和 persona2 具有相同的 inversedBy="weddings",所以它不起作用。

我也尝试了 2 个 ManyToMany 关系,但 Doctrine 不喜欢它:

 // Character
  /**
  * @ORM\ManyToMany(targetEntity=Wedding::class, mappedBy="persona1")
  */
private $weddings1;

/**
 * @ORM\ManyToMany(targetEntity=Wedding::class, mappedBy="persona2")
 */
private $weddings2;
// Wedding

/**
 * @ORM\ManyToMany(targetEntity=Character::class, inversedBy="weddings1")
 */
private $persona1;

/**
 * @ORM\ManyToMany(targetEntity=Character::class, inversedBy="weddings2")
 */
private $persona2;

The mappings App\Entity\Wedding#persona2 and App\Entity\Character#weddings are inconsistent with each other.

什么是好的关系,ManyToOne 或 ManyToMany,因为每个婚礼都与 2 个字符相关?如何让它与 Doctrine 一起工作?

感谢所有建议!

1 个答案:

答案 0 :(得分:0)

如果字符 1 和字符 2 之间没有这样的特定原因或区别,我建议在 ManyToManyWedding 实体之间有 Character 关系

class Character
{
    // ...
    
    /**
    * @ORM\ManyToMany(targetEntity=Wedding::class, mappedBy="characters")
    */
    private $weddings;
}

class Wedding
{
    // ...
    
    /**
     * @ORM\ManyToMany(targetEntity=Character::class, inversedBy="weddings")
     */
    private $characters;
}

如果您有更多角色要分配给婚礼,您可以通过这种方式在未来进行缩放

如果根据您的需要需要针对字符 1 或字符 2 执行任何严格的操作,那么您可以使用 OneToManyManyToOne 作为

class Character
{
    // ...

    /**
     * @ORM\OneToMany(targetEntity=Wedding::class, mappedBy="characterA")
     */
    private $weddingsA;

    /**
     * @ORM\OneToMany(targetEntity=Wedding::class, mappedBy="characterB")
     */
    private $weddingsB;
}

class Wedding
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity=Character::class, inversedBy="weddingsA")
     */
    private $characterA;
    
    /**
     * @ORM\ManyToOne(targetEntity=Character::class, inversedBy="weddingsB")
     */
    private $characterB;
}
相关问题