2017-02-17 10 views
0

Почему я не могу удалить запись в базе данных с помощью Doctrine 2 Entity manager? У меня есть следующий контроллер и сущность, с которыми у меня проблема. Я получаю в диспетчере сущности объекта контроллера и я не могу удалить этот объект. Зачем?Не работает «remove» в Doctrine2

// /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; 

Спасибо!

+2

попытки удаление '$ em-> сохраняется ($ услуги);' – Matteo

+0

@Matteo, это удивительное. Это работает для меня. Большое спасибо! – ladone

ответ

0

@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, что вы хотите создать (или, фактически: сохранить) объект. (Обратите внимание, что в «Доктрине» «persist» не означает, что соединение связано с базой данных, но вместо этого вы передаете объект EM/UOW для вычисления изменений.)

Итак, в заключение, операция persist отменила remove, и в этот момент flush не имел ничего общего.

Для получения более подробной информации о жизненном цикле объекта и состоянии ЭМ см http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html

+0

Большое спасибо за разъяснение! – ladone