Skip to content

Instantly share code, notes, and snippets.

@matteosavio
Forked from baptistedonaux/DeletedFilter.php
Last active December 26, 2018 13:25
Show Gist options
  • Save matteosavio/dfb7ddb9c0625a3f2b418babc4cc479f to your computer and use it in GitHub Desktop.
Save matteosavio/dfb7ddb9c0625a3f2b418babc4cc479f to your computer and use it in GitHub Desktop.
Soft Delete Symfony/Doctrine
# config/packages/doctrine.yaml
doctrine:
orm:
filters:
deleted:
class: 'App\Repository\Filters\DeletedFilter'
enabled: true
<?php
namespace App\Repository\Filters;
use Doctrine\ORM\Mapping\ClassMetaData;
use Doctrine\ORM\Query\Filter\SQLFilter;
class DeletedFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if ($targetEntity->hasField("deletedOn")) {
$date = date("Y-m-d h:m:s");
return $targetTableAlias." . deleted_on < '" . $date . "' OR " . $targetTableAlias.".deleted_on IS NULL";
}
return "";
}
}
<?php
namespace App\EventListener;
use Doctrine\ORM\Event\PreFlushEventArgs;
class DoctrineListener
{
public function preFlush(PreFlushEventArgs $event) {
$em = $event->getEntityManager();
foreach ($em->getUnitOfWork()->getScheduledEntityDeletions() as $object) {
if (method_exists($object, "getDeletedOn")) {
if ($object->getDeletedOn() instanceof \Datetime) {
continue;
} else {
$object->setDeletedOn(new \DateTime());
$em->merge($object);
$em->persist($object);
}
}
}
}
}
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
class Base
{
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $deletedOn;
public function getDeletedOn(): ?\DateTimeInterface
{
return $this->deletedOn;
}
public function setDeletedOn(?\DateTimeInterface $deletedOn): self
{
$this->deletedOn = $deletedOn;
return $this;
}
}
# config/services.yml
App\EventListener\DoctrineListener:
public: false
tags:
- { name: doctrine.event_listener, event: preFlush, method: preFlush }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment