PHPackages                             chefsplate/mongodb-odm-softdelete - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. chefsplate/mongodb-odm-softdelete

ActiveLibrary[Database &amp; ORM](/categories/database)

chefsplate/mongodb-odm-softdelete
=================================

Doctrine MongoDB MongoDB SoftDelete Library

0.1.0(12y ago)03701LGPLPHPPHP &gt;=5.3.2

Since May 14Pushed 9y ago2 watchersCompare

[ Source](https://github.com/chefsplate/mongodb-odm-softdelete)[ Packagist](https://packagist.org/packages/chefsplate/mongodb-odm-softdelete)[ Docs](http://www.doctrine-project.org)[ RSS](/packages/chefsplate-mongodb-odm-softdelete/feed)WikiDiscussions master Synced 3d ago

READMEChangelogDependencies (1)Versions (1)Used By (1)

Doctrine MongoDB ODM SoftDelete Functionality
=============================================

[](#doctrine-mongodb-odm-softdelete-functionality)

This library gives you some additional classes and API for managing the soft deleted state of Doctrine MongoDB ODM documents. To get started you just need to configure a few objects and get a SoftDeleteManager instance:

Setup
-----

[](#setup)

```
use Doctrine\ODM\MongoDB\SoftDelete\Configuration;
use Doctrine\ODM\MongoDB\SoftDelete\UnitOfWork;
use Doctrine\ODM\MongoDB\SoftDelete\SoftDeleteManager;
use Doctrine\Common\EventManager;

// $dm is a DocumentManager instance we should already have

$config = new Configuration();
$evm = new EventManager();
$sdm = new SoftDeleteManager($dm, $config, $evm);

```

SoftDelete Documents
--------------------

[](#softdelete-documents)

In order for your documents to work with the SoftDelete functionality they must implement the SoftDeleteable interface:

```
interface SoftDeleteable
{
    function getDeletedAt();
}

```

An implementation might look like this:

```
use Doctrine\ODM\MongoDB\SoftDelete\SoftDeleteable;

/** @mongodb:Document */
class User implements SoftDeleteable
{
    // ...

    /** @mongodb:Date */
    private $deletedAt;

    public function getDeletedAt()
    {
        return $this->deletedAt;
    }

    // ...
}

```

Managing Soft Delete State
--------------------------

[](#managing-soft-delete-state)

Once you have the $sdm you can start managing the soft delete state of your documents:

```
$jwage = $dm->getRepository('User')->findOneByUsername('jwage');
$fabpot = $dm->getRepository('User')->findOneByUsername('fabpot');
$sdm->delete($jwage);
$sdm->delete($fabpot);
$sdm->flush();

```

The above would issue a simple query setting the deleted date:

```
db.users.update({ _id : { $in : userIds }}, { $set : { deletedAt : new Date() } })

```

Now if we were to restore the documents:

```
$sdm->restore($jwage);
$sdm->flush();

```

It would unset the deletedAt date:

```
db.users.update({ _id : { $in : userIds }}, { $unset : { deletedAt : true } })

```

Events
------

[](#events)

We trigger some additional event lifecycle events when documents are soft deleted or restored:

- Events::preSoftDelete
- Events::postSoftDelete
- Events::preRestore
- Events::postRestore

Using the events is easy, just define a class like the following:

```
class TestEventSubscriber implements \Doctrine\Common\EventSubscriber
{
    public function preSoftDelete(LifecycleEventArgs $args)
    {
        $document = $args->getDocument();
        $sdm = $args->getSoftDeleteManager();
    }

    public function getSubscribedEvents()
    {
        return array(Events::preSoftDelete);
    }
}

```

Now we just need to add the event subscriber to the EventManager:

```
$eventSubscriber = new TestEventSubscriber();
$evm->addEventSubscriber($eventSubscriber);

```

When we soft delete something the preSoftDelete() method will be invoked before any queries are sent to the database:

```
$sdm->delete($fabpot);
$sdm->flush();

```

Cascading Soft Deletes
----------------------

[](#cascading-soft-deletes)

You can easily implement cascading soft deletes by using events in a certain way. Imagine you have a User and Post document and you want to soft delete a users posts when you delete him.

You just need to setup an event listener like the following:

```
use Doctrine\Common\EventSubscriber;

class CascadingSoftDeleteListener implements EventSubscriber
{
    public function preSoftDelete(LifecycleEventArgs $args)
    {
        $sdm = $args->getSoftDeleteManager();
        $document = $args->getDocument();
        if ($document instanceof User) {
            $sdm->deleteBy('Post', array('user.id' => $document->getId()));
        }
    }

    public function preRestore(LifecycleEventArgs $args)
    {
        $sdm = $args->getSoftDeleteManager();
        $document = $args->getDocument();
        if ($document instanceof User) {
            $sdm->restoreBy('Post', array('user.id' => $document->getId()));
        }
    }

    public function getSubscribedEvents()
    {
        return array(
            Events::preSoftDelete,
            Events::preRestore
        );
    }
}

```

Now when you delete an instance of User it will also delete any Post documents where they reference the User being deleted. If you restore the User, his Post documents will also be restored.

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity12

Limited adoption so far

Community18

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

4383d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/b1be8f3b039aaefeace8d9764c520d37107609790175f7b46096094a448440e8?d=identicon)[bmanza87](/maintainers/bmanza87)

---

Top Contributors

[![jwage](https://avatars.githubusercontent.com/u/97422?v=4)](https://github.com/jwage "jwage (12 commits)")[![jmikola](https://avatars.githubusercontent.com/u/244663?v=4)](https://github.com/jmikola "jmikola (4 commits)")[![jjbohn](https://avatars.githubusercontent.com/u/401301?v=4)](https://github.com/jjbohn "jjbohn (3 commits)")[![leek](https://avatars.githubusercontent.com/u/60204?v=4)](https://github.com/leek "leek (1 commits)")[![matwright](https://avatars.githubusercontent.com/u/4989280?v=4)](https://github.com/matwright "matwright (1 commits)")[![websirnik](https://avatars.githubusercontent.com/u/282871?v=4)](https://github.com/websirnik "websirnik (1 commits)")[![coderbyheart](https://avatars.githubusercontent.com/u/188915?v=4)](https://github.com/coderbyheart "coderbyheart (1 commits)")[![wmxscott](https://avatars.githubusercontent.com/u/9037816?v=4)](https://github.com/wmxscott "wmxscott (1 commits)")[![julesbou](https://avatars.githubusercontent.com/u/328303?v=4)](https://github.com/julesbou "julesbou (1 commits)")[![kriswallsmith](https://avatars.githubusercontent.com/u/33886?v=4)](https://github.com/kriswallsmith "kriswallsmith (1 commits)")

---

Tags

persistencemongodbsoftdelete

### Embed Badge

![Health badge](/badges/chefsplate-mongodb-odm-softdelete/health.svg)

```
[![Health](https://phpackages.com/badges/chefsplate-mongodb-odm-softdelete/health.svg)](https://phpackages.com/packages/chefsplate-mongodb-odm-softdelete)
```

###  Alternatives

[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[doctrine/mongodb-odm-bundle

Symfony Doctrine MongoDB Bundle

38418.7M195](/packages/doctrine-mongodb-odm-bundle)[mongodb/mongodb-extension

MongoDB driver extension

91919.8k](/packages/mongodb-mongodb-extension)[doctrine/doctrine-mongo-odm-module

Laminas Module which provides Doctrine MongoDB ODM functionality

86676.6k35](/packages/doctrine-doctrine-mongo-odm-module)[sonata-project/doctrine-mongodb-admin-bundle

Symfony Sonata / Integrate Doctrine MongoDB ODM into the SonataAdminBundle

68839.2k3](/packages/sonata-project-doctrine-mongodb-admin-bundle)[ismaambrosi/generator-bundle

Generates Symfony2 documents, forms and CRUD

2692.9k](/packages/ismaambrosi-generator-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
