Nasıl Symfony / Doktrini bir davranışı ayırmak mı?

6 Cevap php

Benim modellerin tüm bağlı öğretinin softdelete davranış var. Ben zor belirli bir kaydı silebilirsiniz bir yolu var mı?

CakePHP'de ben ... davranışını ayırarak kayıt silme ve daha sonra davranışı takılarak yeniden hatırlıyorum.

Symfony / doktrinde benzer bir şey var mı? Eğer öyleyse o zaman nasıl bir davranış ayırmak mı?

Şerefe

6 Cevap

Ben Zed yol gitmek istiyorum düşünüyorum, ama bütünlüğü için:

Yumuşak silme davranışı için silme için olay dinleyicisi yöntemi (seçin) içerir:

if ( ! $query->contains($field)) {
   // do the magic stuff to covert the query to respect softdelete
}

Bu açıkça sorguda alan söz varsa, o sorguya dönüşüm uygulamak anlamına gelir.

Yani, yapmanız eğer:

$q = Doctrine_Query::create()
->delete('Table t')
->where('t.id = ? AND t.deleted != 2 ', 1);

Bu yumuşak silme şeyler geçerli olmayacak ve aslında kaydını silecektir. Eğer t.deleted ile her şeyi yapabilir unutmayın, ben her zaman doğru olacak bir şey yaptık. Ad ('t.') Çalışması için çok önemlidir.

Bu hile Ben normalde önce kullandım nerede, hangi de seçtiği için çalışıyor.

Ama dediğim gibi, ben bunu yapmak çok güzel düşünüyorum:

$old_dqlc = Doctrine_Manager::getInstance()->getAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS);
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);
$record->delete();
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, $old_dqlc);

Özellikle, hala yerine el sorgu oluşturmak zorunda kalmadan daha delete () yöntemini kullanabilirsiniz. Sorgu yöntemi için bir artı kayda bağlı diğer davranışlar varsa, onlar hala saygı olmasıdır.

umm .. SoftDelete behavior Bu sadece ... çağrıyı yapmanın çok güzel bir yol içerir

$record->hardDelete();

$object->getListener()->setOption('disabled',true);

Bu, bu nesne için tüm kayıt dinleyicileri devre dışı bırakır.

Bu aramayı deneyin, bu davranış işleme devre dışı bırakmak gerekir.

$manager->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);

Kirli bir yol olarak size kayıt tablodan siler bir SQL sorgusu oluşturabilir.

link text i bu fonksiyonu ve sadece yöneticisi gibi false kullanım dql geri aramaları ayarı :) hile yapmak gerektiğini düşünürdüm.

En iyi yolu kullanmak olacağını Joshua Coady katılıyorum istedi

$record->hardDelete()

Ancak, ben de "seçer" için davranışını ayırmak için kolay yolu "deleted_at" (ya da her türlü alan adı var dahil olmak olduğunu doktrininde davranışını ayırmak için google ilk sonuçlarından biri olduğundan burada eklemek istedim sorguda gibi. dinleyici o dahil olup olmadığını görmek için bakar ve eğer öyleyse silinen kayıtları filtre etmez.

Doctrine_Core::getTable('Record')->createQuery()->select('id, etc1, etc2')->addSelect('deleted_at')->execute();

Silinen kayıtları dönecektir.