Symfony 4:从实体中删除集合

Symfony 4: remove collection from entity

我有一个产品实体和一个产品图片实体。我只想对产品实体使用软删除并删除产品图像实体。 软删除工作正常。当我删除产品时,deleted_at 列设置为当前时间。 所以我想在更新 deleted_at 列时删除产品图片。 我想知道是否可以直接在实体 class 中进行?以及如何?

我尝试在 setDeletedAt 函数中进行集合删除的产品实体。

<?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 ...

感谢您的帮助!

---- 更新 ----

John 提供的解决方案工作正常:

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

谢谢!

不言自明的错误:

此时:

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

您正在传递一个集合而不是单个 ProductImage 对象。

要全部删除它们,只需执行以下操作:

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