Ошибки ассоциации с Doctrine после обновления - PullRequest
3 голосов
/ 25 апреля 2019

Я работаю над обновлением продукта с Symfony 2.7 до 4.2 (в настоящее время на 3.4) и застреваю с некоторыми существующими ассоциациями.

  • Поле AppBundle \ Entity \ User # currentBillingAgreement находится на стороне-владельце двунаправленного отношения, но указанная ассоциация mappedBy в целевом объекте AppBundle \ Entity \ BillingAgreement # не содержит обязательного атрибута "inversedBy".
  • Если ассоциация AppBundle \ Entity \ User # currentBillingAgreement является взаимно-однозначной, то пользователь AppBundle \ Entity \ BillingAgreement # с обратной стороны также должен быть взаимно-однозначным.

Сущность 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 находится на стороне-владельце двунаправленной связи, но указанная ассоциация mappedBy в целевом объекте AppBundle \ Entity \ User # не содержит обязательного атрибута "inversedBy".

и оригинальные ошибки 2 остаются.

1 Ответ

0 голосов
/ 01 мая 2019

Вы можете сделать ассоциацию 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;

Ссылки

...