symfony - Doctrine OneToOne 删除实体

标签 symfony orm doctrine-orm entity-relationship one-to-one

当我删除实体时,关系 OneToOne 尚未删除。图库已成功从数据库中删除,但largeImage、mediumImage 和smallImage 尚未删除。

我做错了什么?

删除 Controller 中的操作:

public function deleteAction($id)
{
    $em = $this->getDoctrine()->getManager();
    $offer = $em->getRepository('ToCmsBundle:Offer')->find($id);

    if($offer) {

        if(!$offer->getGallery()->isEmpty()) {
            foreach($offer->getGallery() as $key => $image) {
                $image->setOffer(null);
                $offer->removeGallery($image);
                //$em->remove($image);
                //$em->flush();
                echo $image->getPath() . '<br/>';
            }
        } else {
            echo 'gallery is empty';
        }

        $offer->setLargeImage(null);
        $offer->setMediumImage(null);
        $offer->setSmallImage(null);

        $em->remove($offer);

        $em->flush();
    }

    return $this->redirect($this->generateUrl('to_offer_list'));
}

我的所有者类别:

/**
 * Offer
 *
 * @ORM\Table(name="to_offer")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Entity(repositoryClass="To\CmsBundle\Repository\OfferRepository")
 */
class Offer {

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

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     */
    private $content;

    /**
     * @var ArrayCollection
     * 
     * @ORM\OneToMany(targetEntity="Image", mappedBy="offer", cascade={"all"}, orphanRemoval=true)
     */
    private $gallery;

    /**
     * @var Image
     * 
     * @ORM\OneToOne(targetEntity="Image", cascade={"all"}, orphanRemoval=true)
     */
    public $largeImage;

    /**
     * @var Image
     * 
     * @ORM\OneToOne(targetEntity="Image", cascade={"all"}, orphanRemoval=true)
     */
    public $mediumImage;

    /**
     * @var Image
     * 
     * @ORM\OneToOne(targetEntity="Image", cascade={"all"}, orphanRemoval=true)
     */
    public $smallImage;

    /**
     * @var ArrayCollection
     * 
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="articles")
     * @ORM\JoinTable(name="to_articles_categories")
     */
    private $categories;

    /**
     * @var User
     * 
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="author_id", referencedColumnName="id")
     */
    private $author;

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

    /** other stuff */
}

图像类别:

/**
 * Image
 *
 * @ORM\Table(name="to_images")
 * @ORM\Entity(repositoryClass="To\CmsBundle\Repository\ImageRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Image
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="hashName", type="string", length=255)
     */
    private $hashName;

    /**
     * @var integer
     *
     * @ORM\Column(name="position", type="integer")
     */
    private $position;

    /**
     * @var string
     *
     * @ORM\Column(name="path", type="string", length=255)
     */
    private $path;

    /**
     * @var string
     *
     * @ORM\Column(name="thumbnail", type="string", length=255)
     */
    private $thumbnail;

    /**
     * @var string
     *
     * @ORM\Column(name="originalImage", type="string", length=255)
     */
    private $originalImage;

    /**
     * @var Offer
     * 
     * @ORM\ManyToOne(targetEntity="Offer", inversedBy="gallery")
     * @ORM\JoinColumn(name="offer_id", referencedColumnName="id", nullable=true)
     */
    private $offer;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="createdAt", type="datetime")
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="updatedAt", type="datetime")
     */
    private $updatedAt;

    /**
     * @var integer
     *
     * @ORM\Column(name="x", type="integer")
     */
    protected $x = 0;

    /**
     * @var integer
     *
     * @ORM\Column(name="y", type="integer")
     */
    protected $y = 0;

    /**
     * @var integer
     *
     * @ORM\Column(name="w", type="integer")
     */
    protected $w = 0;

    /**
     * @var integer
     *
     * @ORM\Column(name="h", type="integer")
     */
    protected $h = 0;

    /**
     * @var boolean
     * 
     * @ORM\Column(name="defaultImage", type="boolean")
     */
    private $default = 0;


    public function __construct() {
        $this->position = 0;
        $this->default = 0;
        $this->x = 0;
        $this->y = 0;
    }
    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        $this->position = $this->position ?: 0;
        $this->default = $this->default ?: 0;
        $this->x = $this->x ?: 0;
        $this->y = $this->y ?: 0;

        /*if (null !== $this->getFile()) {
            // do whatever you want to generate a unique name
            $this->name = sha1(uniqid(mt_rand(), true));
            $this->originName = $this->getFile()->getClientOriginalName();
            $this->extension = $this->getFile()->guessExtension();

            $this->path = $this->name.'.'.$this->extension;
        }*/
    }

    /**
     * @ORM\PreRemove()
     */
    public function removeUpload()
    {

        echo $this->getRootPath().$this->originalImage; echo '<br/>';
        echo $this->getRootPath().$this->thumbnail; echo '<br/>';
        echo $this->getRootPath().$this->path; echo '<br/>';
        echo '<br/><br/>';

        if(file_exists($this->getRootPath().$this->originalImage))
            unlink($this->getRootPath().$this->originalImage);
        if(file_exists($this->getRootPath().$this->thumbnail))
            unlink($this->getRootPath().$this->thumbnail);
        if(file_exists($this->getRootPath().$this->path))
            unlink($this->getRootPath().$this->path);
    }
    /** other stuff */
}

最佳答案

您的实体正在相互引用,因此您应该尝试删除这些实体:

$offer->setLargeImage(null);
$offer->setMediumImage(null);
$offer->setSmallImage(null);

并在 $em->remove($offer); 之前和之后调用一次 flush() 一次。

foreach ($offer->getGallery() as $image) {
    $offer->removeGallery($image);
}
$em->flush();

$em->remove($offer);
$em->flush();

只有当所有图像都是“私有(private)”时,这才会按原样工作,这意味着它们不会在此实体或另一个实体中多次引用。

关于symfony - Doctrine OneToOne 删除实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18568565/

相关文章:

php - 与另一个表没有关系的 LeftJoin 别名创建问题 Doctrine Symfony

javascript - JS文件已加载但未执行

php - fatal error : Class 'Symfony\Component\Console\Input\ArgvInput' not found in app/console on line 16

php - 如何处理包含 500 多个项目的 Symfony 表单集合

java - @SecondaryTable 注释不适用于不同架构中的相同表名

java - 使用 DAO 模式时,您是否曾将 EntityManager 或 Session 公开为参数?

php - Doctrine2/Symfony 2 @ParamConverter 使用自定义存储库方法删除未映射的参数

orm - 大规模 ORM - 多个表上的事务

php - 除非我明确调用 AnnotationDriver::getAllClassNames,否则 Doctrine 不起作用

php - 重置学说 2 ID