Доктрина 2.x - это модифицированный эквивалент? - PullRequest
2 голосов
/ 27 июля 2011

В Doctrine 1.x был метод $ entity-> isModified (), который оказался весьма полезным. Кто-нибудь нашел способ повторить эту функцию в Doctrine 2.x?

Я исследовал несколько способов, таких как получение UnitOfWork, запрос его вычисления для рассматриваемой сущности, а затем запрос о том, находится ли этот объект в очереди на изменения, но все это вызвало неприятную сторону -эффекты, такие как отношения M2M, вставляются дважды, вызывая исключение ограничения базы данных. Я предполагаю, что это означает, что это «не по назначению»!

Кажется огромным дублированием работы прибегнуть к отслеживанию изменений с помощью другого метода, когда Doctrine уже отслеживает, поэтому я надеюсь, что есть способ.

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Я хотел бы увидеть некоторый код, чтобы понять, как он вставляется дважды. Кроме того, почему вы хотите это сделать?

В любом случае, вы можете изменить политику отслеживания . Похоже, вы ищете политику уведомления.

Иначе, вы всегда можете использовать аннотацию перед обновлением , если вам это сойдет с рук.

Я рекомендую вам не использовать persist / all cascade в ассоциациях - тогда вы получите исключение, когда вам нужно будет сначала сохранить ассоциации. Может помочь в отладке с двойной проблемой персистентности.

0 голосов
/ 16 июня 2016

В нашей CMS, основанной на Doctrine 1.x, мы обычно выбираем соответствующую сущность, заполняем ее данными и затем запрашиваем $ entity-> isModified ()?(А если нет, то мы могли бы отправить отзыв пользователю - «Без изменений»)

В отношении кода замена isModified () выглядит примерно так:

public function isModified($entity) {
  $metadata = $this->em->getClassMetadata(get_class($entity));
  $uow = $this->em->getUnitOfWork();

  $uow->computeChangeSet($metadata, $entity);
  return $uow->isEntityScheduled($entity);
}

К сожалению, если мыдобавлены отношения M2M, поэтому M2M добавляется дважды при сохранении, вероятно, из-за того, что Doctrine затем вызывает uow-> computeChangeSets (), в результате чего вставка M2M ставится в очередь дважды.

Мыприбегли к тому, чтобы сделать что-то похожее на то, что предлагается в политике отслеживания уведомлений - по сути, перехватывая все наши сеттеры.

ПРИМЕЧАНИЕ Этот ответ был отправлен под вопросом OP Mark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...