Symfony2中“级联删除”父实体时的EntityNotFoundException

时间:2014-03-13 15:43:22

标签: php mysql symfony doctrine

我有一个Symfony2应用程序,它具有以下设置:

Agencija(塞尔维亚语代理机构)实体有两种类型Slika(塞尔维亚语单词)实体 - $maliLogoSlika$velikiLogoSlika

Slika实体用于描述和处理将通过表单上传的图片。 Slika中有两个Agencija类型的字段,它们都映射到同一个实体,因此是同一个表。两个实体都映射到MySQL表。

添加新的Agencija条目工作正常,表填充和文件添加到文件系统,但删除是问题。当我尝试删除一个具有两个映射Agencija条目的Slika条目时,只发生的事情是从文件系统中删除一个文件(映射到$maliLogoSlika的文件)。所有表保持不变,另一个文件不会被删除。

最后我收到以下错误:

  

未找到实体。 500内部服务器错误 -   EntityNotFoundException

在分析器中,在Doctrine下我得到了这个:

  
      
  • " START TRANSACTION"参数:{} [显示可运行查询]时间:0.00毫秒[+解释查询]
  •   
  • 收缩查询DELETE FROM agencija WHERE id =?参数:[11] [显示可运行查询]时间:0.00毫秒[+解释查询]
  •   
  • 收缩查询DELETE FROM slika WHERE id =?参数:[21] [显示可运行查询]时间:1.00毫秒[+解释查询]
  •   
  • 收缩查询SELECT t0.id AS id1,t0.naziv AS naziv2,t0.path AS path3 FROM slika t0参数:{} [显示可运行   查询]时间:1.00毫秒[+解释查询]
  •   
  • 收缩查询DELETE FROM slika WHERE id =?参数:[22] [显示可运行查询]时间:225.01 ms [+解释查询]
  •   
  • 收缩查询SELECT t0.id AS id1,t0.naziv AS naziv2,t0.path AS path3 FROM slika t0参数:{} [显示可运行   查询]时间:1.00毫秒[+解释查询]
  •   
  • " ROLLBACK"参数:{} [显示可运行查询]时间:23.00毫秒[+解释查询]
  •   

我理解的部分是未受影响的表 - 这是因为交易失败。删除的文件因第一次查询完成时触发的@ORM\PostRemove()注释而被删除,即使整个事务失败也是如此。

我不明白的部分是,为什么我会收到错误? :)它对我来说,它与Agencija表中指向同一(Slika)表的两个外键有关。也许别名需要不同?

Agencija.php

namespace Letovanje\AgencijaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Agencija
 *
 * @ORM\Table(name="agencija", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"id"}), @ORM\UniqueConstraint(name="naziv_UNIQUE", columns={"naziv"})}, indexes={@ORM\Index(name="fk_agencija_slika1_idx", columns={"mali_logo_slika_id"}), @ORM\Index(name="fk_agencija_slika2_idx", columns={"veliki_logo_slika_id"})})
 * @ORM\Entity(repositoryClass="Letovanje\AgencijaBundle\Entity\AgencijaRepository")
 */
class Agencija
{

    /**
     * @var \Letovanje\SlikaBundle\Entity\Slika
     *
     * @ORM\ManyToOne(targetEntity="Letovanje\SlikaBundle\Entity\Slika", cascade={"persist","remove"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="veliki_logo_slika_id", referencedColumnName="id")
     * })
     */
    private $velikiLogoSlika;

    /**
     * @var \Letovanje\SlikaBundle\Entity\Slika
     *
     * @ORM\ManyToOne(targetEntity="Letovanje\SlikaBundle\Entity\Slika", cascade={"persist","remove"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="mali_logo_slika_id", referencedColumnName="id")
     * })
     */
    private $maliLogoSlika;

    //...
 }

Slika.php (与this示例中的文档实体基本相同)

<?php

namespace Letovanje\SlikaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * Slika
 *
 * @ORM\Table(name="slika", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"id"})})
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Slika
{
    //...

    /**
     * @ORM\PostRemove()
     */
    public function removeUpload()
    {
        if ($file = $this->getAbsolutePath()) {
            unlink($file);
        }
    }

    //...

}

从控制器调用删除操作(此处仅粘贴相关部分)。

DefaultController.php

public function deleteAction($naziv){
        $repository = $this->getDoctrine()
                           ->getRepository('LetovanjeAgencijaBundle:Agencija');
        $agencija = $repository->findOneByNaziv($naziv);

        $em = $this->getDoctrine()->getManager();
        $em->remove($agencija);
        $em->flush();

        $this->get('session')->getFlashBag()->add(
            'success',
            'Agencija uspesno obrisana!'
        );

        return $this->redirect($this->generateUrl('agencije'));

    }

最后两张表:

agencija

CREATE TABLE IF NOT EXISTS `letovanje`.`agencija` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `naziv` VARCHAR(45) NOT NULL,
  `je_aktivna` TINYINT(1) NOT NULL,
  `web_adresa` VARCHAR(45) NOT NULL,
  `mali_logo_slika_id` INT NOT NULL,
  `veliki_logo_slika_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  UNIQUE INDEX `naziv_UNIQUE` (`naziv` ASC),
  INDEX `fk_agencija_slika1_idx` (`mali_logo_slika_id` ASC),
  INDEX `fk_agencija_slika2_idx` (`veliki_logo_slika_id` ASC),
  CONSTRAINT `fk_agencija_slika1`
    FOREIGN KEY (`mali_logo_slika_id`)
    REFERENCES `letovanje`.`slika` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_agencija_slika2`
    FOREIGN KEY (`veliki_logo_slika_id`)
    REFERENCES `letovanje`.`slika` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SLIKA

CREATE TABLE IF NOT EXISTS `letovanje`.`slika` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `naziv` VARCHAR(45) NOT NULL,
  `path` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB

0 个答案:

没有答案