Введение

В этой статье мы обсудим все о мягком удалении Laravel, что это такое и как его использовать, но сначала позвольте мне немного рассказать вам о функции, которую мы все знаем, любим и используем на наших компьютерах (если вы хотите пройти это введение, перейдите к заголовку Laravel Soft Delete).

Когда вы удаляете файл на своем компьютере, он исчезнет, ​​но вы все равно сможете найти его в корзине и, конечно же, восстановить.

Таким образом, удаленный файл на самом деле не удаляется с вашего компьютера, он невидим и помечен как удаленный, а корзина — это просто место, где отображается список файлов, помеченных как удаленные.

Удаление записи в вашем приложении из базы данных является окончательным, она исчезла навсегда, вы не можете получить к ней доступ снова и вы не можете восстановить ее, возможно, вы можете использовать резервную копию, но я думаю, что вы поняли идею.

Что делать, если пользователь случайно удалил некоторые данные?

Что, если вы хотите дать пользователю возможность восстановить удаленные данные?

Что делать, если вы хотите удержать пользователей на некоторое время после того, как они удалили свои учетные записи?

Мягкое удаление — это решение, оно реализует ту же логику, что и корзина с компьютеров, поэтому удаление записей будет просто помечать их как удаленные, а не удалять из базы данных.

Мягкое удаление Laravel

Команда Laravel проделала большую работу, предоставив встроенную функцию для обратимого удаления записей, ее реализация так же проста, как просто добавление нового столбца таблицы deleted_at и использование признака SoftDeletes в вашей модели.

Как использовать мягкое удаление в Laravel

Теперь мы увидим, как мы можем реализовать мягкое удаление Laravel, это так просто, я обещаю.

Например, у нас есть модель Post и мы хотим добавить возможность восстановления удаленных постов, давайте включим обратимое удаление для этой модели.

1. Черта мягкого удаления: SoftDeletes

Первый шаг — добавить в модель трейт SoftDeletes:

Illuminate\Database\Eloquent\SoftDeletes

2. Миграция с обратимым удалением

В качестве второго и последнего шага мы должны добавить столбец deleted_at в таблицу сообщений, мы будем использовать вспомогательный метод softDeletes() следующим образом:

Вот и все!

Теперь, когда вы вызываете метод delete, вместо удаления записи из базы данных столбец deleted_at будет заполнен текущей датой и временем, и, конечно же, эта удаленная запись всегда будет исключена из всех будущих результатов запроса, как если бы она удалил на самом деле.

Как восстановить мягко удаленные записи

Если мы хотим получить список всех мягко удаленных сообщений пользователя, мы можем сделать это следующим образом:

Как я сказал выше, обратимо удаленные записи всегда будут исключаться из результатов запроса, но если мы хотим включить их по какой-либо причине, мы можем использовать withTrashed() :

Как восстановить мягко удаленные записи

Легко, используйте метод restore(), он просто установит для столбца deleted_at значение null:

Вы можете использовать метод trashed, чтобы проверить, была ли запись удалена безвозвратно:

Как навсегда удалить запись

Если по какой-либо причине вы хотите навсегда удалить запись, вы можете использовать метод forceDelete:

Сокращение обратимо удаленных записей

Мягкое удаление записей в течение длительного времени заполнит вашу базу данных ненужными данными, поэтому имеет смысл периодически удалять некоторые из мягко удаленных данных, для этого вы можете использовать трейт Illuminate\Database\Eloquent\Prunable или Illuminate\Database\Eloquent\MassPrunable, разница между ними в том, что MassPrunable будет удалять записи с помощью запросов на массовое удаление, поэтому события модели не будут отправляться.

После выбора и использования одной из приведенных выше характеристик добавьте метод prunable, который возвращает построитель запросов Eloquent, который определяет, какие записи вы хотите удалить:

Последний шаг — запланировать model:prune в классе App\Console\Kernel:

И вы сделали.

Если вы хотите, например, удалить изображения, связанные с публикацией после обрезки, вы можете использовать метод pruning, который вызывается непосредственно перед удалением записи:

Примечание. этот метод не будет вызываться, если вы использовали трейт Illuminate\Database\Eloquent\MassPrunable.