不要在Doctrine2中“删除”

时间:2017-02-17 20:31:39

标签: php mysql symfony doctrine-orm

为什么我无法使用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;

谢谢!

1 个答案:

答案 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