首页 > 解决方案 > 升级后与 Doctrine 的关联错误

问题描述

我正在努力将产品从 Symfony 2.7 升级到 4.2(目前为 3.4),并且遇到了一些现有的关联。

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")) 时,我收到一个新错误:

原来的 2 个错误仍然存​​在。

标签: doctrine-ormdoctrine

解决方案


您可以通过从注释中删除来使 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;

参考


推荐阅读