Я предполагаю, что у вас есть две коллекции, ArticleTag и Article, в которых статьи имеют ссылки на теги статьи.Если вы хотите удалить ссылки на теги из статей при удалении тега, вы можете реализовать прослушиватель событий.
Создать класс:
namespace Foo\BarBundle\EventListener;
use Doctrine\ODM\MongoDB\Event\LifecycleEventArgs;
use Foo\BarBundle\Document\Article;
class ArticleTagRemovalListener
{
public function preRemove(LifecycleEventArgs $args)
{
$document = $args->getDocument();
if ($document instanceof Article) {
// Remove tag from all articles
$args
->getDocumentManager()
->getRepository('FooBarBundle:Article')
->removeTag($document);
}
}
}
и зарегистрировать этот класс в своем файле services.yml
или xml:
foo_bar.listener.tag_removal:
class: Foo\BarBundle\EventListener\ArticleTagRemovalListener
tags:
- { name: doctrine_mongodb.odm.event_listener, event: preRemove }
Далее в пользовательском классе хранилища вашей статьи добавьте следующий метод:
public function removeTag($tag)
{
return $this
->createQueryBuilder()
->update()
->field('tags')->pull($tag)
->multiple(true)
->getQuery()
->execute();
}
Это удалит тег из всех доступных статей перед его удалением,Если вы хотите каскадно удалить операцию для всех документов статьи.(Таким образом, при удалении этого тега удаляйте все статьи с определенным тегом, используйте следующий метод репозитория.)
public function purgeByTag($tag)
{
$result = $this
->createQueryBuilder()
->remove()
->field('tags')->equals($tag)
->getQuery()
->execute();
return $result['n'];
}
Обновите ArticleTagRemovalListener, чтобы вызвать этот метод, и готово!