stichtingsd / soft-deleteable-extension-bundle
Extension to Gedmo Softdeleteable.
Installs: 1 867
Dependents: 1
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=8.1
- doctrine/common: ^2.13 || ^3.0
- doctrine/doctrine-bundle: ^2.7
- doctrine/orm: ^2.7
- gedmo/doctrine-extensions: ^3.4
- symfony/framework-bundle: ^6.1
- symfony/property-access: ^6.1
Requires (Dev)
- doctrine/cache: ^2.0
- doctrine/dbal: ^3.2
- friendsofphp/php-cs-fixer: dev-master
- phpunit/phpunit: ^9.5
- symfony/phpunit-bridge: ^6.1
This package is auto-updated.
Last update: 2024-11-05 16:57:41 UTC
README
Warning: This bundle only works with Symfony ^6.0 and PHP ^8.1
This bundle is created to handle soft deletes for associated entities/documents in addition to the functionality of Gedmo SoftDelete. Gedmo does not handle CASCADING relations for example. Doctrine doesn't also since it's not actually deleted.
The bundle also handles deletion of large entities very well thanks to Doctrine DQL and Proxy objects. Entities that have 10.000+ relations are updated in a split second.
Prerequisites
This bundle requires Symfony ^6.1 or higher and PHP ^8.1 or higher
- Symfony ^6.0
- PHP ^8.1
- doctrine/doctrine-extensions ^2.0 | ^3.0 (Gedmo)
Installation
Add stichtingsd/soft-deleteable-extension-bundle to your composer.json
file:
composer require "stichtingsd/soft-deleteable-extension-bundle"
Bundle registration (Skip when using Symfony Flex)
Register bundle into config/bundles.php (Flex did it automatically):
# config/bundles.php return [ ... new StichtingSD\SoftDeleteableExtensionBundle\StichtingSDSoftDeleteableExtensionBundle(), ];
Getting started
Cascade soft deletedelete the entity
To (soft-)delete an entity when its parent record is soft-deleted:
use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Attribute as StichtingSD;
use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Type;
...
#[StichtingSD\onSoftDelete(type: Type::CASCADE)]
Set reference to null (instead of deleting the entity)
use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Attribute as StichtingSD;
use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Type;
...
#[StichtingSD\onSoftDelete(type: Type::SET_NULL)]
Supported association types:
- One-To-One
- Type::CASCADE
- Type::SET_NULL
- Many-To-One
- Type::CASCADE
- Type::SET_NULL
- Many-To-Many
- Type::REMOVE_ASSOCIATION_ONLY
Type::CASCADE
This behaves like the SQL CASCADE. All relations that have a soft deleteable field from Gedmo will be deleted also.
Type::SET_NULL
This behaves like the SQL SET_NULL. The relation will be set to NULL.
Caution: Your field must be nullable: true
to allow null values.
Type::REMOVE_ASSOCIATION_ONLY
This will remove the association only. Associated entities them self are not deleted since they can have other associations.
Full example Many-To-One
<?php declare(strict_types=1); namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Attribute as StichtingSD; use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Type; use App\Entity\Tenant; #[ORM\Entity(repositoryClass: 'App\Repository\UserRepository')] #[Gedmo\SoftDeleteable(fieldName: 'deletedAt')] class User { ... #[StichtingSD\onSoftDelete(type: Type::CASCADE)] #[ORM\ManyToOne(targetEntity: Tenant::class)] #[ORM\JoinColumn(nullable: false)] private ?Tenant $tenant; ... }
Full example Many-To-Many (mapped side)
<?php declare(strict_types=1); namespace App\Entity; use App\Entity\Tenant; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\Collection; use Gedmo\Mapping\Annotation as Gedmo; use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Attribute as StichtingSD; use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Type; #[ORM\Entity(repositoryClass: 'App\Repository\UserRepository')] #[Gedmo\SoftDeleteable(fieldName: 'deletedAt')] class User { ... #[StichtingSD\onSoftDelete(type: Type::REMOVE_ASSOCIATION_ONLY)] #[ORM\ManyToMany(targetEntity: Tenant::class, inversedBy: 'users')] private Collection $tenants; ... }
Full example Many-To-Many (inversed side)
<?php declare(strict_types=1); namespace App\Entity; use App\Entity\User; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Attribute as StichtingSD; use StichtingSD\SoftDeleteableExtensionBundle\Mapping\Type; #[ORM\Entity(repositoryClass: 'App\Repository\TenantRepository')] #[Gedmo\SoftDeleteable(fieldName: 'deletedAt')] class Tenant { ... #[StichtingSD\onSoftDelete(type: Type::REMOVE_ASSOCIATION_ONLY)] #[ORM\ManyToMany(targetEntity: User::class, mappedBy: 'tenants')] private Collection $users; ... }
Limitations
Many-To-Many
- Currently, it's only possible to use the
Type::REMOVE_ASSOCIATION_ONLY
.
One-To-Many
- Not supported, and won't be. Define it on the Many-To-One side.