2012-11-26 18 views
7

मैं नरम हटाने योग्य व्यवहार प्राप्त करने के लिए StofDoctrineExtensionsBundle के साथ उपयोग कर रहा हूं।नरम हटाने योग्य व्यवहार और वास्तव में इकाई को हटाने

यह मेरे आवेदन के अग्रभाग में वास्तव में अच्छा काम करता है।

बैकएंड में मुझे "हार्ड" इकाइयों को हटाने का विकल्प चाहिए।

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

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

यह काम करता है (नरम हटाए गए संस्थाओं सूचियों में दिखाने), लेकिन जब मैं इसे हटाने का प्रयास, इकाई करता है:

मैं (मैं SonataAdmin का उपयोग करें) मेरी व्यवस्थापक नियंत्रकों में फिल्टर निष्क्रिय कर दिया है फिर से मुलायम हटा दिया। मैं "हार्ड" को कैसे हटा सकता हूं?

उत्तर

10

आपको फ़िल्टर को अक्षम करने की आवश्यकता नहीं है - यह सिर्फ चयन पर रिकॉर्ड फ़िल्टर करने के लिए उपयोग किया जाता है। आप श्रोता बजाय अक्षम करना होगा:

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

@ जेसिका, आप '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); 
} 

} 

और अपने config में जोड़ने:

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

नहीं सबसे सुंदर तरीका: आप हमेशा एक कर सकते हैं असली एसक्यूएल के साथ हटाने के लिए, यह बायपास करेंगे 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 क्षेत्र के अंदर कोई मान्य दिनांक कॉल करते समय है - के बाद> फ्लश() एक -> हटाने ($ इकाई) अपने इकाई मुश्किल से हटा दिया जाएगा

+1

इसे उत्तर के रूप में स्वीकार किया जाना चाहिए। – Veve

संबंधित मुद्दे