كيفية تجاوز إجراء PreuPdate لعدم تعديل حقل `updated_at` في العقيدة؟
سؤال
أرغب في تعطيل السلوك التلقائي لتغيير حقل "updated_at" عند تحديث كائن. أريد أن أفعل ذلك يدويًا ؛ أو على الأقل ، لديك القدرة على التعطيل على النحو المطلوب.
أعلم أنه يمكنني القيام بذلك عن طريق بناء سلوكي الخاص كما في هذه الإجابة العظيمة. لكنني كنت أبحث عن شيء "أنظف" يعدل مستمع للكائن.
- لقد حاولت تجاوز إجراء preupdate () على النموذج.
- لقد حاولت تعطيل المستمعين ، ولا شيء:
--
Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', true);
// or
Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', array('preUpdate'));
// As reference, I've used these two lines on a Symfony Task
أي أفكار أخرى ، أو رمز للنظر؟
شكرًا!
المحلول
حسب المستندات في http://www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors#timestampable إذا كنت ترغب في استخدام الطابع الزمني ولكن ليس الجزء المحدث منه مجرد استخدام:
Timestampable:
updated:
disabled: true
وأضف في حقل updated_at الخاص بك في قسم الأعمدة.
نصائح أخرى
يمكنك الوصول إلى المستمع مباشرة من كائنك مثل هذا:
$listenerChain = $this->getListener();
$i = 0;
while ($listener = $listenerChain->get($i))
{
if ($listener instanceof Doctrine_Template_Listener_Timestampable)
{
$listener->setOption('disabled', true);
break;
}
$i++;
}
الطريقة الأكثر بساطة للقيام بذلك هي إعادة تسمية updated_at
حقل لشيء آخر. بحيث يتم تجاهلها من قبل العقيدة.
بهذه الطريقة ، يمكنك التحكم في محتويات الحقل بالضبط.
// get the first (in our case the timstampable) listener for the record
$timestampable = $record->getListener()->get(0);
// disable setting of created_at at the timestampable listener
$timestampable->setOption(array('created' => array('disabled' => true)));
المشكلة هي أنه عليك معرفة موقف المستمع
يمكنك أيضًا تعطيل جميع المستمعين بهذه الطريقة:
$record->getListener()->setOption('disabled',true);