doctrine-orm - 升级后与 Doctrine 的关联错误
问题描述
我正在努力将产品从 Symfony 2.7 升级到 4.2(目前为 3.4),并且遇到了一些现有的关联。
- 字段 AppBundle\Entity\User#currentBillingAgreement 位于双向关系的拥有方,但目标实体 AppBundle\Entity\BillingAgreement# 上指定的 mappedBy 关联不包含所需的“inversedBy”属性。
- 如果关联 AppBundle\Entity\User#currentBillingAgreement 是一对一的,那么反面 AppBundle\Entity\BillingAgreement#user 也必须是一对一的。
该User
实体具有以下关联:
/**
* @var BillingAgreement
* @ORM\OneToOne(
* targetEntity="AppBundle\Entity\BillingAgreement",
* inversedBy="user",
* cascade={"persist"}
* )
* @ORM\JoinColumn(
* name="currentBillingAgreementID",
* referencedColumnName="billingAgreementID"
* )
*/
protected $currentBillingAgreement;
/**
* @var ArrayCollection
* @ORM\OneToMany(
* targetEntity="AppBundle\Entity\BillingAgreement",
* mappedBy="user",
* cascade={"persist"}
* )
* @Serializer\Exclude()
*/
protected $billingAgreements;
BillingAgreement 有这个:
/**
* @var User
* @ORM\ManyToOne(
* targetEntity="AppBundle\Entity\User",
* inversedBy="billingAgreements"
* )
* @ORM\JoinColumn(
* name="userID",
* referencedColumnName="userID",
* nullable=false
* )
*/
protected $user;
当我将 OneToOne 映射添加到BillingAgreement::$user
( @ORM\OneToOne(targetEntity="AppBundle\Entity\User", inversedBy="currentBillingAgreement")
) 时,我收到一个新错误:
- AppBundle\Entity\BillingAgreement#user 字段位于双向关系的拥有方,但目标实体 AppBundle\Entity\User# 上指定的 mappedBy 关联不包含所需的“inversedBy”属性。
原来的 2 个错误仍然存在。
解决方案
您可以通过从注释中删除来使 OneToOne 关联单向。inversedBy="user",
或者
为 BillingAgreement 实体上的每个关联使用不同的字段:
/**
* @var User
* @ORM\ManyToOne(
* targetEntity="AppBundle\Entity\User",
* inversedBy="billingAgreements"
* )
* @ORM\JoinColumn(
* name="userID",
* referencedColumnName="userID",
* nullable=false
* )
*/
protected $user;
/**
* @var User
* @ORM\OneToOne(targetEntity="AppBundle\Entity\User", inversedBy="currentBillingAgreement")
*/
protected $singleUser;
在用户实体中:
/**
* @var BillingAgreement
* @ORM\OneToOne(
* targetEntity="AppBundle\Entity\BillingAgreement",
* inversedBy="singleUser",
* cascade={"persist"}
* )
* @ORM\JoinColumn(
* name="currentBillingAgreementID",
* referencedColumnName="billingAgreementID"
* )
*/
protected $currentBillingAgreement;
/**
* @var ArrayCollection
* @ORM\OneToMany(
* targetEntity="AppBundle\Entity\BillingAgreement",
* mappedBy="user",
* cascade={"persist"}
* )
* @Serializer\Exclude()
*/
protected $billingAgreements;
参考