我有一个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