DOCTRINE ManyToMany orphanRemoval无法正常工作?

时间:2019-12-06 16:53:48

标签: symfony doctrine many-to-many

我对manyToMany关系和orphanRemoval有一些问题。 我有两个实体,例如:

class Issuer
{
    /**
     * @var string
     *
     * @ORM\Id
     * @ORM\Column(type="string", length=20)
     */
    private $productCode;
    /**
     * @ManyToMany(targetEntity="Bid", inversedBy="issuers", cascade={"merge"}, orphanRemoval=true)
     * @JoinTable(
     *     name="issuers_issuer_bids",
     *     joinColumns={
     *     @JoinColumn(name="product_code", referencedColumnName="product_code")
     * },
     *     inverseJoinColumns={
     *     @JoinColumn(name="bid", referencedColumnName="bid")
     * })
     * * @var Collection
     */
    private $bids;

class Bid
{
    /**
     * @var string
     *
     * @ORM\Id
     * @ORM\Column(type="string", length=10)
     */
    private $bid;

    /**
     * @ManyToMany(targetEntity="Issuer", mappedBy="bids")
     */
    private $issuers;

场景:

在数据库中,我有两个发布者TEST和TEST2,它们都与一个bid = 1234相关,因此在joinTable中,我有两个记录TEST-> 1234和TEST2-> 1234。当我删除发布者TEST原则时,也删除了它的连接表单连接表(TEST-> 1234),出价表中的bid = 1234保持不变。到目前为止,一切都很好。在此之后,我删除了颁发者TEST2,连接表单联接表也被删除了,但投标表中的bid = 1234仍然保持不变。为什么不将其删除,因为它现在是孤儿?有人可以帮我解释这个问题吗?

更新:

我通过以下方式解决了这个问题:删除发行人时,我检查每个出价是否恰好有一个发行人。如果是这样,则意味着在删除发行人之后,该出价将成为孤立的出价,因此我也将其删除:

发行方实体注释:

/**
     * @ORM\ManyToMany(targetEntity="Bid", inversedBy="issuers")
     * @ORM\JoinTable(
     *     name="issuers_issuer_bids",
     *     joinColumns={
     *     @ORM\JoinColumn(name="product_code", referencedColumnName="product_code")
     * },
     *     inverseJoinColumns={
     *     @ORM\JoinColumn(name="bid", referencedColumnName="bid")
     * })
     * @var Collection
     */
     private $bids;

出价实体注释:

    /**
     * @ORM\ManyToMany(targetEntity="Issuer", mappedBy="bids")
     * @var Collection
     */
    private $issuers;

删除存储类中的方法:

   /**
    * @param string $productCode
    *
    * @throws CantFindIssuerException
    */
    public function deleteIssuer(string $productCode): void
    {
        /** @var IssuerEntity $issuer */
        $issuer = $this->complexIssuerRepository
            ->getIssuerRepository()
            ->find($productCode);

        if (null === $issuer) {
            throw new CantFindIssuerException();
        }

        /**
         * Remove orphans as orphanRemoval=true wont work properly with manyToMany relations.
         * @var Bid $bid
         */
        foreach ($issuer->getBids() as $bid) {
            if ($bid->getIssuers()->count() === 1) {
                $this->entityManager->remove($bid);
            }
        }

        $this->entityManager->remove($issuer);
        $this->entityManager->flush();
    }

我希望它能对某人有所帮助:) 如果有人知道更好的解决方案,请分享。

0 个答案:

没有答案