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.

Revisions

  1. matteosavio revised this gist Dec 26, 2018. 6 changed files with 37 additions and 54 deletions.
    28 changes: 13 additions & 15 deletions DeletedFilter.php
    Original file line number Diff line number Diff line change
    @@ -1,19 +1,17 @@
    <?php
    namespace Namespace\MyBundle\Repository\Filters;
    namespace App\Repository\Filters;

    use Doctrine\ORM\Mapping\ClassMetaData;
    use Doctrine\ORM\Query\Filter\SQLFilter;

    use Doctrine\ORM\Mapping\ClassMetaData;
    use Doctrine\ORM\Query\Filter\SQLFilter;

    class DeletedFilter extends SQLFilter
    {
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    class DeletedFilter extends SQLFilter
    {
    if ($targetEntity->hasField("deletedAt")) {
    $date = date("Y-m-d h:m:s");

    return $targetTableAlias.".deletedAt < '".$date."' OR ".$targetTableAlias.".deletedAt IS NULL";
    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 "";
    }

    return "";
    }
    }
    }
    10 changes: 4 additions & 6 deletions DoctrineListener.php
    Original file line number Diff line number Diff line change
    @@ -1,21 +1,19 @@
    <?php
    namespace Namespace\MyBundle\Listener;
    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, "getDeletedAt")) {
    if ($object->getDeletedAt() instanceof \Datetime) {
    if (method_exists($object, "getDeletedOn")) {
    if ($object->getDeletedOn() instanceof \Datetime) {
    continue;
    } else {
    $object->setDeletedAt(new \DateTime());
    $object->setDeletedOn(new \DateTime());
    $em->merge($object);

    $em->persist($object);
    }
    }
    34 changes: 11 additions & 23 deletions Entity.php
    Original file line number Diff line number Diff line change
    @@ -1,37 +1,25 @@
    <?php
    namespace Namespace\MyBundle\Entity;

    namespace App\Entity;

    use Doctrine\ORM\Mapping as ORM;

    class Entity
    class Base
    {
    /**
    * @var datetime $deletedAt
    *
    * @ORM\Column(name="deletedAt", type="datetime", nullable=true)
    * @ORM\Column(type="datetime", nullable=true)
    */
    private $deletedAt;
    private $deletedOn;

    /**
    * Set deletedAt
    *
    * @param \DateTime $deletedAt
    * @return Plan
    */
    public function setDeletedAt($deletedAt)
    public function getDeletedOn(): ?\DateTimeInterface
    {
    $this->deletedAt = $deletedAt;

    return $this;
    return $this->deletedOn;
    }

    /**
    * Get deletedAt
    *
    * @return \DateTime
    */
    public function getDeletedAt()
    public function setDeletedOn(?\DateTimeInterface $deletedOn): self
    {
    return $this->deletedAt;
    $this->deletedOn = $deletedOn;

    return $this;
    }
    }
    7 changes: 4 additions & 3 deletions config.yml
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,8 @@
    # app/config/config.yml
    # config/packages/doctrine.yaml
    doctrine:
    orm:
    filters:
    deleted:
    class: 'Namespace\MyBundle\Repository\Filters\DeletedFilter'
    enabled: true
    class: 'App\Repository\Filters\DeletedFilter'
    enabled: true

    5 changes: 5 additions & 0 deletions services.yaml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    # config/services.yml
    App\EventListener\DoctrineListener:
    public: false
    tags:
    - { name: doctrine.event_listener, event: preFlush, method: preFlush }
    7 changes: 0 additions & 7 deletions services.yml
    Original file line number Diff line number Diff line change
    @@ -1,7 +0,0 @@
    # src/namespace/mybundle/Resources/config/services.yml
    services:
    kernel.listener.doctrine:
    class: Namespace\MyBundle\Listener\DoctrineListener
    public: false
    tags:
    - { name: doctrine.event_listener, event: preFlush, method: preFlush }
  2. @baptistedonaux baptistedonaux created this gist Feb 19, 2015.
    19 changes: 19 additions & 0 deletions DeletedFilter.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,19 @@
    <?php
    namespace Namespace\MyBundle\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("deletedAt")) {
    $date = date("Y-m-d h:m:s");

    return $targetTableAlias.".deletedAt < '".$date."' OR ".$targetTableAlias.".deletedAt IS NULL";
    }

    return "";
    }
    }
    24 changes: 24 additions & 0 deletions DoctrineListener.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,24 @@
    <?php
    namespace Namespace\MyBundle\Listener;

    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, "getDeletedAt")) {
    if ($object->getDeletedAt() instanceof \Datetime) {
    continue;
    } else {
    $object->setDeletedAt(new \DateTime());
    $em->merge($object);

    $em->persist($object);
    }
    }
    }
    }
    }
    37 changes: 37 additions & 0 deletions Entity.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,37 @@
    <?php
    namespace Namespace\MyBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;

    class Entity
    {
    /**
    * @var datetime $deletedAt
    *
    * @ORM\Column(name="deletedAt", type="datetime", nullable=true)
    */
    private $deletedAt;

    /**
    * Set deletedAt
    *
    * @param \DateTime $deletedAt
    * @return Plan
    */
    public function setDeletedAt($deletedAt)
    {
    $this->deletedAt = $deletedAt;

    return $this;
    }

    /**
    * Get deletedAt
    *
    * @return \DateTime
    */
    public function getDeletedAt()
    {
    return $this->deletedAt;
    }
    }
    7 changes: 7 additions & 0 deletions config.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    # app/config/config.yml
    doctrine:
    orm:
    filters:
    deleted:
    class: 'Namespace\MyBundle\Repository\Filters\DeletedFilter'
    enabled: true
    7 changes: 7 additions & 0 deletions services.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    # src/namespace/mybundle/Resources/config/services.yml
    services:
    kernel.listener.doctrine:
    class: Namespace\MyBundle\Listener\DoctrineListener
    public: false
    tags:
    - { name: doctrine.event_listener, event: preFlush, method: preFlush }