2012-11-26 3 views
7

부드러운 삭제 가능 동작을 얻으려면 DoctrineExtensionsStofDoctrineExtensionsBundle을 사용하고 있습니다.소프트 삭제 가능 동작 및 엔티티 삭제 실제로

내 응용 프로그램의 프론트 엔드에서 정말 잘 작동합니다.

백엔드에서 "하드"엔티티를 삭제할 수있는 옵션이 필요합니다. 이것은 (소프트 삭제 된 개체가 목록에 표시),하지만 난 그것을 삭제하려고하면, 기업이하는 일

$filters = $this->getModelManager()->getEntityManager($this->getClass())->getFilters(); 

if (array_key_exists('softdeleteable', $filters->getEnabledFilters())) { 
    $filters->disable('softdeleteable'); 
} 

:

나는 내 관리 컨트롤러에서 필터를 (내가 SonataAdmin 사용) 비활성화 다시 소프트 삭제됩니다. 강제로 "강제로 삭제"할 수 있습니까?

답변

10

필터를 비활성화 할 필요가 없습니다. select에서 레코드를 필터링하는 데만 사용되었습니다. 이 질문은 조금 오래된하지만 어쩌면 누군가에게 유용

// $em is your EntityManager 
foreach ($em->getEventManager()->getListeners() as $eventName => $listeners) { 
    foreach ($listeners as $listener) { 
     if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) { 
      $em->getEventManager()->removeEventListener($eventName, $listener); 
     } 
    } 
} 

을 다음

$em->remove($entity); 
$em->flush(); 
+0

방법이 후 다시 사용할 수 있습니까 삭제됩니다? – Jessica

+0

@Jessica, 당신은'addEventListener'를 사용할 수 있습니다 http://api.symfony.com/2.4/Symfony/Bridge/Doctrine/ContainerAwareEventManager.html#method_addEventListener – Dmitriy

+0

대단히 감사드립니다. 내가 한 일은 내가했던 모든 이벤트의 이름을 저장하는 것이 었습니다. 그것을 제거한 다음, 루프를 반복하고 다시 추가하십시오. – Jessica

0

전화 :

더 나은 수 있습니다 자신의 이벤트 리스너를 만들기 대신 리스너를 해제해야합니다 솔루션 :

class SoftDeleteableListener extends BaseSoftDeleteableListener 
{ 

/** 
* @inheritdoc 
*/ 
public function onFlush(EventArgs $args) 
{ 
    $ea = $this->getEventAdapter($args); 
    $om = $ea->getObjectManager(); 
    //return from event listener if you disabled filter: $em->getFilters()->disable('softdeleteable'); 
    if (!$om->getFilters()->isEnabled('softdeleteable')) { 
     return; 
    } 

    parent::onFlush($args); 
} 

} 

귀하의 설정에 추가 :

gedmo.listener.softdeleteable: 
    class: AppBundle\EventListener\SoftDeleteableListener 
    tags: 
     - { name: doctrine.event_subscriber, connection: default } 
    calls: 
     - [ setAnnotationReader, [ @annotation_reader ] ] 

소스 : https://github.com/Atlantic18/DoctrineExtensions/issues/1175

2

아니 가장 우아한 방법 : 당신은 항상 실제 SQL과 삭제하려면 작업을 수행 할 수 있습니다, 그것은 하드에 리스너 또는 아무것도를 만들 수 softdeletable

$em->createQuery("DELETE MyEntity e WHERE e = :et")->setParameter('et',$entity)->execute(); 
4

필요를 무시하지 않습니다 softdeleteable을 사용하여 삭제하십시오. 당신이 경우

$reflProp = $meta->getReflectionProperty($config['fieldName']); 
$oldValue = $reflProp->getValue($object); 
if ($oldValue instanceof \Datetime) { 
    continue; // want to hard delete 
} 

이 모든 의미 :

$entity->setDeletedAt(new \Datetime()); 
$em->flush(); 

: 그리고 그 시점에서

$em->remove($entity); 
$em->flush(); 

은 (는) 자기 삭제됩니다

원래 softdeleteable 이벤트는이 라인을 가지고 .

당신은 allready 당신이 전화 deletedAt 필드 안에 유효한 날짜가있는 경우 -> 플러시() 후를 A -> 제거 ($ 엔티티) 당신의 엔티티가 하드

+1

답변으로 받아 들여야합니다. – Veve