不要在教义中"remove"工作2



为什么我不能使用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

相关内容

  • 没有找到相关文章

最新更新