从集合中删除元素

时间:2014-07-10 11:05:53

标签: php doctrine-orm zend-framework2

我的产品有多张图片。 当我从表单中的产品中删除图像时,它将产品引用设置为NULL。但是,图像仍然存在于数据库中。

我想从数据库中删除图像行。我怎么能这样做?

我的产品实体

    ...

    /**
     * @ORM\OneToMany(targetEntity="ApplicationShared\Entity\Image", mappedBy="product", cascade={"all"})
     * )
     */
    protected $images;

    ...

    /**
     * Get images.
     *
     * @return array
     */
    public function getImages()
    {
        return $this->images;
    }

    /**
     * Add a image to the product.
     *
     * @param Images
     *
     * @return void
     */
    public function addImages(Collection $images)
    {
        foreach ($images as $image) {
            $image->setProduct($this);
            $this->images->add($image);
        }
    }

    /**
     * @param Collection $images
     */
    public function removeImages(Collection $images)
    {
        foreach ($images as $image) {
            $image->setProduct(null);
            $this->images->removeElement($image);
        }
    }

图片实体

...

/**
 * @ORM\ManyToOne(targetEntity="ApplicationShared\Entity\Product", inversedBy="images")
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
 */
protected $product;

...

/**
 * Allow null to remove association
 *
 * @param Product $product
 */
public function setProduct(Product $product = null)
{
    $this->product = $product;
}

/**
 * Get product.
 *
 * @return array
 */
public function getProduct()
{
    return $this->product;
}

1 个答案:

答案 0 :(得分:2)

我认为解决方案是orphanRemoval属性(http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-associations.html#orphan-removal

“当使用orphanRemoval = true选项时,Doctrine假设实体是私有的,不会被其他实体重用。如果忽略这个假设,即使你将孤立的实体分配给了Doctrine,你的实体也会被删除另一个。“

所以你的OneToMany方面应该是:

@ORM\OneToMany(targetEntity="ApplicationShared\Entity\Image", mappedBy="product", cascade={"all"}, orphanRemoval=true)