كيفية تجاوز إجراء PreuPdate لعدم تعديل حقل `updated_at` في العقيدة؟

StackOverflow https://stackoverflow.com/questions/2292897

سؤال

أرغب في تعطيل السلوك التلقائي لتغيير حقل "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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top