SoftDeletable

← SoftDeletable

Ashterix

docs: Doctrine section with Doctrine Behaviors and Doctrine Helper (uk + en)

uk/docs/doctrine/doctrine-behaviors/soft_deletable.md новий файл +65 −0

1 + # SoftDeletable
2 +
3 + «М'яке» видалення: `remove()` не видаляє рядок, а ставить час видалення в `deletedAt`.
4 +
5 + ## Сутність
6 +
7 + ```php
8 + use Doctrine\ORM\Mapping as ORM;
9 + use Ufo\DoctrineBehaviors\Contract\Entity\SoftDeletableInterface;
10 + use Ufo\DoctrineBehaviors\Model\SoftDeletable\SoftDeletableTrait;
11 +
12 + #[ORM\Entity]
13 + class Category implements SoftDeletableInterface
14 + {
15 + use SoftDeletableTrait;
16 +
17 + #[ORM\Id, ORM\GeneratedValue, ORM\Column]
18 + private ?int $id = null;
19 + }
20 + ```
21 +
22 + Бандл мапить `deletedAt` (`datetime`, nullable).
23 +
24 + ## Як це працює
25 +
26 + У `onFlush` кожна сутність із `SoftDeletableInterface`, запланована до видалення, отримує `delete()` (поточний час у `deletedAt`) і зберігається знову — замість `DELETE` виконується `UPDATE`.
27 +
28 + :::warning
29 + Фільтра запитів немає: `find()`, репозиторії й DQL повертають і «видалені» сутності. Відсіюйте їх самі — умовою `deletedAt IS NULL` або перевіркою `isDeleted()`.
30 + :::
31 +
32 + Каскадне видалення пов'язаних сутностей Doctrine виконує як завжди: «м'яко» видаляються лише ті, що теж реалізують `SoftDeletableInterface`.
33 +
34 + ## Використання
35 +
36 + ```php
37 + $entityManager->remove($category);
38 + $entityManager->flush();
39 +
40 + $category = $categoryRepository->find($id); // сутність на місці
41 + $category->isDeleted(); // true
42 + ```
43 +
44 + ### Відновлення
45 +
46 + ```php
47 + $category->restore(); // deletedAt = null
48 + $category->isDeleted(); // false
49 + $entityManager->flush();
50 + ```
51 +
52 + ### Видалення в заданий час
53 +
54 + ```php
55 + $category->setDeletedAt(new \DateTime('+1 day'));
56 + $category->isDeleted(); // false — до настання дати
57 + $category->willBeDeleted(); // true
58 + $entityManager->flush();
59 + ```
60 +
61 + | Метод | Що повертає |
62 + | --- | --- |
63 + | `isDeleted()` | `true`, якщо `deletedAt` задано і вже настав |
64 + | `willBeDeleted(?DateTimeInterface $at = null)` | `true`, якщо `deletedAt` задано (і, якщо передано `$at`, не пізніше за нього) |
65 + | `getDeletedAt()` | `?DateTimeInterface` |