Symfony 4: удалить коллекцию из сущности - PullRequest
1 голос
/ 26 октября 2019

У меня есть объект продукта и объект изображения продукта. Я хочу использовать мягкое удаление только для объекта продукта и удалить объект изображения продукта. Софт-удаление отлично работает. Когда я удаляю товар, в столбце delete_at устанавливается текущее время. Поэтому я хотел бы удалить изображение продукта при обновлении столбца delete_at. Мне было интересно, могу ли я сделать это прямо в классе сущностей? и как?

Сущность продукта, в которой я пытаюсь сделать сбор данных в функции setDeletedAt. * ​​1003 *

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 * @ORM\Table(name="product")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ProductImage", mappedBy="product", orphanRemoval=true, cascade={"persist"})
     */
    private $productImages;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $deleted_at;

    public function __construct()
    {
        $this->productImages = new ArrayCollection();
    }

    public function setDeletedAt(?\DateTimeInterface $deleted_at): self
    {
        // Here I try to remove images when deleted_at column is updated
        $productImage = $this->getProductImages();
        $this->removeProductImage($productImage);

        $this->deleted_at = $deleted_at;
        return $this;
    }

    /**
     * @return Collection|ProductImage[]
     */
    public function getProductImages(): Collection
    {
        return $this->productImages;
    }

    public function addProductImage(ProductImage $productImage): self
    {
        if (!$this->productImages->contains($productImage)) {
            $this->productImages[] = $productImage;
            $productImage->setProduct($this);
        }

        return $this;
    }

    public function removeProductImage(ProductImage $productImage): self
    {
        if ($this->productImages->contains($productImage)) {
            $this->productImages->removeElement($productImage);
            // set the owning side to null (unless already changed)
            if ($productImage->getProduct() === $this) {
                $productImage->setProduct(null);
            }
        }
        return $this;
    }
}

Но когда я делаю мягкое удаление, вызывается setDeletedAt () и возникает следующая ошибка:возвращено:

Argument 1 passed to App\Entity\Product::removeProductImage() must be an instance of App\Entity\ProductImage, instance of Doctrine\ORM\PersistentCollection given, called in ...

Спасибо за вашу помощь!

---- ОБНОВЛЕНИЕ ----

Решение, предоставленное Джоном, прекрасно работает:

foreach ($this->getProductImages() as $pi) {
    $this->removeProductImage($pi);
}

Спасибо!

1 Ответ

0 голосов
/ 26 октября 2019

довольно очевидная ошибка:

в этот момент:

    $productImage = $this->getProductImages();
    $this->removeProductImage($productImage);

вы передаете коллекцию вместо одного объекта ProductImage.

, чтобы удалить их все,просто сделайте:

foreach ($this->getProductImages() as $pi) {
    $this->removeProductImage($pi);
}
...