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);
}
我有一个产品实体和一个产品图片实体。我只想对产品实体使用软删除并删除产品图像实体。 软删除工作正常。当我删除产品时,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);
}