为什么我不能使用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
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMColumn(type="string", length=50)
*/
private $name;
/**
* @ORMManyToOne(targetEntity="SentviBundleEntityLanguage")
* @ORMJoinColumn(name="language_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $language;
/**
* @ORMColumn(name="common_identifier", type="text")
*/
private $commonIdentifier;
谢谢!
@matteo的评论已经解决了问题,但让我解释发生了什么。
您正在执行3个实体管理器操作:
$em->remove($services);
$em->persist($services);
$em->flush();
您必须知道,在致电$em->flush()
之前,所有操作均在称为"工作单位"(UOW)的服务中注册。
UOW跟踪您的实体中的所有修改(包括添加/删除实体),并且在调用flush()
时仅将它们应用于数据库。
调用$em->remove($services)
时,您告诉UOW您想删除实体。但是,此后直接调用$em->persist($services)
时,您告诉UOW,您要创建(或有效地:保留)实体。(请注意,在学说中,"持续存在"并不意味着与数据库建立了连接,而是您将实体传递给EM/UOW以计算修改。)
因此,总而言之,persist
操作取消了remove
,而flush
无关紧要。
有关实体生命周期和EM状态的更多详细信息,请参见http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-with-with-with-objects.html