Symfony2: временно отключить softdelete

#php #symfony

#php #symfony

Вопрос:

Я хочу временно отключить softdelete, чтобы я мог находить удаленные объекты по идентификатору, а затем действительно удалять их в своих модульных тестах (чтобы убедиться, что я не засоряю базу данных).

Что я пробовал:

 $this->em->getFilters()->disable('softdeletable');
$item = $repository->findOneById($id); //fetch the item which was soft-deleted
$this->em->remove($item);
$this->em->flush();
  

Но это выдает ошибку:

 InvalidArgumentException : Filter 'softdeletable' is not enabled.
  

Я также пробовал отключить (‘soft-deletable’) и отключить (‘soft-deleteable’) и т. Д. — Ничего не сработало. Но когда я смотрю на $this->em->getFilters(), фильтр ЕСТЬ:

 ["enabledFilters"]=>
  array(1) {
    ["softdeletable"]=>
      string(48) "GedmoSoftDeleteableFilterSoftDeleteableFilter"
  }
  

Попытка кода без отключения, конечно, тоже не работает:

 DoctrineORMORMInvalidArgumentException : EntityManager#remove() expects parameter 1 to be an entity object, NULL given.
  

Что я делаю не так? Я знаю, что я действительно могу что-то удалить, установив значение deletedAt в новое DateTime, но как мне удалить элемент, не извлекая его сначала?

Спасибо за вашу помощь!

Комментарии:

1. Вы используете это в цикле или что-то в этом роде? Если это так, возможно, фильтр уже отключен. Вы могли бы проверить, включен ли он, прежде чем отключать использование if ($this->em->getFilters()->isEnabled('softdeleteable'))...

2. @Chi не могли бы вы попробовать $filters = $this->getContainer()->get('doctrine')->getEntityManager()->getFilters(); $filters->disable('softdeleteable'); и сказать мне, есть ли у вас ошибка?

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

4. @lolmx опубликуйте это как ответ 😉

Ответ №1:

Изначально комментарий….

Вы используете это в цикле или что-то в этом роде?
Если это так, возможно, фильтр уже отключен.

Вы могли бы проверить, включен ли он, прежде чем отключать использование, если хотите…

 $this->em->getFilters()->isEnabled('softdeleteable'))...