一个实体与另一个实体有 2 个 ManyToOne 关系

One entity having 2 ManyToOne relations to the same other entity

我正在使用 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;
[...]
}

我试图在 Wedding 实体(persona1 和 persona2)中设置 2 个不同的 ManyToOne 关系,但是 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,因为每个 Wedding 都与 2 个角色相关?如何让它与 Doctrine 一起工作?

谢谢大家的建议!

小灰

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

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;
}