Как переопределить действие preupdate, чтобы не изменить мое поле `nuped_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