Doctrine update entity с arraycollection не удаляет элементы - PullRequest
0 голосов
/ 13 июня 2018

У меня есть следующие классы:

AbstractBillingInvoice

/**
 * @ORM\Table(name="billing_invoice")
 * @ORM\Entity(repositoryClass="BillingBundle\Repository\AbstractBillingInvoiceRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="billingInvoiceType", type="string")
 * @ORM\DiscriminatorMap({"ProFormaInvoice" = "\BillingBundle\Entity\BillingInvoices\ProFormaInvoice", "Invoice" = "\BillingBundle\Entity\BillingInvoices\Invoice"})
 * @GRID\Column(id="billingInvoiceType", filterable=false, type="abstract_billing_invoice")
 * @GRID\Column(id="downloadInvoice", filterable=false, type="download_invoice", safe=false)
 * @Gedmo\SoftDeleteable()
 */
abstract class AbstractBillingInvoice
{
.....
    /**
     * @ORM\OneToMany(targetEntity="BillingBundle\Entity\BillingInvoiceItem", mappedBy="billingInvoice", cascade={"persist","remove"}, orphanRemoval=true)
     */
    private $billingInvoiceItems;
......
    public function __construct()
    {
        $this->billingInvoiceItems = new ArrayCollection();
    }

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getBillingInvoiceItems()
    {
        return $this->billingInvoiceItems;
    }

    public function setBillingInvoiceItems($billingInvoiceItems)
    {
        $this->billingInvoiceItems = $billingInvoiceItems;

        return $this;
    }

    public function addBillingInvoiceItems(BillingInvoiceItem $billingInvoiceItems)
    {
        $billingInvoiceItems->setBillingInvoice($this);
        $this->billingInvoiceItems->add($billingInvoiceItems);

        return $this;
    }

    public function removeBillingInvoiceItems(BillingInvoiceItem $billingInvoiceItems)
    {
        if ($this->billingInvoiceItems->contains($billingInvoiceItems)) {
            $this->billingInvoiceItems->remove($billingInvoiceItems);
        }

        return $this;
    }

и BillingInvoiceItem

class BillingInvoiceItem
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="BillingBundle\Entity\AbstractBillingInvoice", inversedBy="billingInvoiceItems")
     * @ORM\JoinColumn(nullable=false, referencedColumnName="id")
     * @Assert\NotBlank()
     */
    private $billingInvoice;
.....
    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function setBillingInvoice($billingInvoice)
    {
        $this->billingInvoice = $billingInvoice;

        return $this;
    }

    public function getBillingInvoice()
    {
        return $this->billingInvoice;
    }

Все отлично работает, кроме одного - я не могу удалить элементыиз коллекции.С добавлением элемента проблем не возникает, но если какой-либо элемент отсутствует, возможны две ситуации: если удален последний элемент ArrayCollection, в базе данных ничего не происходит.Если удаляется другой элемент, вместо него копируется последний элемент.

Если я сбрасываю сущность AbstractBillingInvoice в EntityListenere в методе onFlush, я вижу данные правильными.Если я удаляю элемент, элемент действительно отсутствует, но после сброса этот элемент возвращается в базу данных.

Что я делаю не так?

Большое спасибо D

1 Ответ

0 голосов
/ 13 июня 2018

обычно мы управляем многими отношениями ArrayCollection из пакета use Doctrine\Common\Collections\ArrayCollection;.

Вы можете обновить свой код следующим образом:

public function __construct() {
    $this->billingInvoice = new ArrayCollection();
    // [...]
}
public function getBillingInvoice(){
    return $this->billingInvoice->toArray();
}

public function addBillingInvoice(BillingInvoice $billingInvoice){
    if(!$this->billingInvoice->contains($billingInvoice)){
        $this->billingInvoice->add($billingInvoice);
    }
}

public function removeBillingInvoice(BillingInvoice $billingInvoice){
    if($this->billingInvoice->contains($billingInvoice)){
        $this->billingInvoice->removeElement($billingInvoice);
    }
}

Затем, когда вы хотите удалить одно отношение,juste call:

$myEntity->removeBillingInvoice($myBillingInvoice);
$em->persist($myEntity);
$em->flush();

Но я не уверен, исправит ли это вашу первоначальную проблему, пытались ли вы проверить, не удалили ли обратное отображение сущность tou billingInvoice?

...