2015-09-17 5 views
0

У меня есть мягкое удаление и поле уникальности. Он отлично работает, но ...Как сделать работу мягкой, удаляемой и уникальной сущностью, используя symfony 2

Если запись удалена «softdeleted», я не могу создать одну и ту же запись. Я думаю, это потому, что запись не удалена в БД. Но мне нужно это.

Итак, что является лучшим способом для dothis?

  1. Общее количество удаленных записей? Так мягко отменяемый хороший выбор?
  2. Найти способ, что если запись SoftDeleted, я могу создать снова ту же запись

Спасибо за ваши советы

ответ

1

У вас есть три варианта

  • Hard Удалить элемент
  • Удалить уникальную (и обрабатывать ее в доктрине)
  • Когда вы создаете новое сущность, вы деактивируете съедобный размягчимый фильтр

    $ em-> getFilters() -> disable ('soft-removeable');

Это позволит вам найти «удаленные» предметы. Затем вы можете делать такие вещи, как перезаписывать старую запись, harddelete ее вручную или независимо от того, что ваше приложение должно вам делать с этим.

2

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

Я предлагаю вам справиться с уникальным проверочное ограничение вручную, это может быть сделано в doctrine life cycle event

Один из способов сделать это путем создания функции обратного вызова в вашей организации и аннотацию огонь по событию:

/** @PrePersist */ 
public function prePersist(LifecycleEventArgs $args) 
{ 
    $entity = $args->getObject(); 
    $entityManager = $args->getObjectManager(); 

    // check if this entity's unique field is OK 
} 

Это гарантирует, что вы не сохраните что-либо неправильное в базе данных, но оно не будет обрабатывать ваши формы красиво. Таким образом, вы, вероятно, захотите использовать для этого UniqueEntity validator и создать пользовательский repositoryMethod, чтобы проверить уникальность.

Этот настраиваемый метод репозитория может использоваться как валидатором prePersist, так и UniqueEntity.

+0

Ваша идея использовать другой '' repositoryMethod'' отлично! У вас есть пример? Он должен быть добавлен в документацию DoctrineExtensions. –

+0

Он доступен в [документации валидатора] (http://symfony.com/doc/current/reference/constraints/UniqueEntity.html # repositorymethod) :) – NDM

+0

Но как я могу изменить его таким образом, чтобы он игнорировал объекты с мягким удалением при поиске дубликатов? –

3

После того как вы удалили уникальное ограничение с уровня базы данных, вы можете установить для этого объекта.

@UniqueEntity(fields={"name", "deleteTime"}, ignoreNull=false) 

В этом случае проверка будет выполнена, если у вас уже есть «не-мягкий удален» строка с заданным именем в базе данных, но это не будет, если deleteTime выставиться.

+0

Я полагаю, это работает, только если в поле «name» есть ограничение NotBlank? – Roubi

+0

Вы правы. Разрешено только одно допустимое значение. Из документации: «ignoreNull: если установлено значение false, допускается только одно значение null» http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#ignorenull – berbadger

 Смежные вопросы

  • Нет связанных вопросов^_^