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` |