为什么我无法使用Doctrine 2 Entity manager删除数据库中的条目? 我有下一个控制器和实体与我有问题。 我进入控制器对象表单实体管理器,我无法删除此对象。为什么呢?
// /Controller/Controller.php
/**
* Handler delete checkbox
* @Route("/administrator/services/delete/{id}", requirements={"id" = "\d+"}, defaults={"id" = 0}, name="service_delete")
* @Template()
*/
public function serviceDeleteAction(Request $request, $id){
$em = $this->getDoctrine()->getEntityManager();
$repoServices = $em->getRepository(CoworkingService::class);
$services = $repoServices->findOneBy(['id' => $id]);
$em->remove($services);
$em->persist($services);
$em->flush();
return [];//$this->redirectToRoute('administrator');
}
// /Entity/CoworkingService.php
class CoworkingService
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=50)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity="SentviBundle\Entity\Language")
* @ORM\JoinColumn(name="language_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $language;
/**
* @ORM\Column(name="common_identifier", type="text")
*/
private $commonIdentifier;
谢谢!
答案 0 :(得分:1)
@Matteo’s comment已经解决了这个问题,但让我解释一下发生了什么。
您正在执行3个实体经理操作:
$em->remove($services);
$em->persist($services);
$em->flush();
您必须知道,在致电$em->flush()
之前,所有操作都在名为“工作单位”(UOW)的服务中注册。
UOW会跟踪您实体中的所有修改(包括添加/删除实体),并仅在您致电flush()
时将其应用于数据库。
调用$em->remove($services)
时,您告诉UOW您要删除该实体。但是,在之后直接调用$em->persist($services)
时,您告诉UOW您要创建(或有效地:保留)实体。 (请注意,在Doctrine中,“persist”并不意味着与数据库建立连接,而是将实体传递给EM / UOW以计算修改。)
总而言之,persist
操作取消了remove
,此时,flush
无关。
有关实体生命周期和EM状态的更多详细信息,请参阅http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html