2012-11-26 17 views
7

Yumuşak silinebilir davranışı almak için StofDoctrineExtensionsBundle numaralı telefonu kullanarak DoctrineExtensions kullanıyorum.Yumuşak şekilde bükülebilen davranış ve gerçekten varlığın silinmesi

Uygulamamın ön tarafında gerçekten iyi çalışıyor.

Arka uçta varlıkları silmek için "zor" seçeneğe ihtiyacım var. Bu (yumuşak silinen kişiler listelerinde görünmesi), ama onu silmeye çalıştığınızda, kurumun ne işleri

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

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

:

benim yönetici kontrolörleri filtreyi (i SonataAdmin kullanın) devre dışı bıraktık yeniden silinir. Bir "zor" silme işlemini nasıl zorlayabilirim?

cevap

10

Filtreyi devre dışı bırakmanız gerekmez - sadece seçili kayıtların filtrelenmesi için kullanılır. Bu soru biraz eski olsa da belki birine yararlıdır

// $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); 
     } 
    } 
} 

ve sonra

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

Bunu nasıl sonra yeniden etkinleştirebilirim silinecek? – Jessica

+0

@Jessica, 'addEventListener' kullanabilirsiniz http://api.symfony.com/2.4/Symfony/Bridge/Doctrine/ContainerAwareEventManager.html#method_addEventListener – Dmitriy

+0

Çok teşekkürler, yaptığım her olayın isimlerini saklamaktı Bunu kaldırın, ardından bunlarla döngü yapın ve tekrar ekleyin. – Jessica

0

çağırır:

daha iyi olabilir Kendi olay dinleyicisi oluşturma yerine dinleyici devre dışı bırakmalısınız çözüm:

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); 
} 

} 

Ve config ekleyerek:

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

kaynak: https://github.com/Atlantic18/DoctrineExtensions/issues/1175

2

değil en zarif yolu: Her zaman gerçek SQL ile silmek bir yapabilirsiniz, bu SERT için bir dinleyici ya da bir şey yaratmak için softdeletable

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

gerek yok atlayacaktır softdeleteable ile silme etkin. eğer

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

Bütün bunlar demek:

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

Ve sonra: Bu noktada

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

zor silinecektir

orijinal softdeleteable olay bu hattı vardır .

allready aramak deletedAt alanı içindeki geçerli bir tarih varsa -> floş() sonra -> kaldırmak ($ ​​varlık), tüzel sert

+1

Bu cevap olarak kabul edilmelidir. – Veve