Безповоротне видалення записів з використанням forceDestroy у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 21 січня, 2025
Вам коли-небудь потрібно було назавжди видалити записи з вашої бази даних у Laravel? Ознайомтеся з новим методом forceDestroy, який спрощує цю задачу, дозволяючи зберігати порядок у вашому коді та легко управляти м'яко видаленими даними

Функція м'якого видалення в Laravel допомагає зберігати цілісність даних, залишаючи видалені записи в базі даних. Проте, іноді потрібно назавжди видалити ці записи. Новий метод forceDestroy спрощує цю процедуру, усуваючи необхідність спочатку отримувати модель перед постійним видаленням.

Цей метод особливо корисний під час виконання операцій очищення, управлінні даними користувачів для дотримання конфіденційності або впровадження систем модерації, де певні записи потрібно повністю видалити з бази даних.

use App\Models\Post;
// Видалення одного запису назавжди
Post::forceDestroy($id);
// Видалення кількох записів
Post::forceDestroy([$id1, $id2, $id3]);

Розгляньмо практичний приклад служби очищення даних:

<?php
 
namespace App\Services;
 
use App\Models\User;
use App\Models\Content;
use Illuminate\Support\Facades\Log;
use App\Events\UserDataPurged;
 
class DataCleanupService
{
    public function purgeInactiveUserData(int $monthsInactive = 12)
    {
        $inactiveUsers = User::onlyTrashed()
            ->where('deleted_at', '<=', now()->subMonths($monthsInactive))
            ->pluck('id');
 
        if ($inactiveUsers->isEmpty()) {
            return ['message' => 'Немає неактивних користувачів для видалення'];
        }
 
        // Спочатку очищаємо пов’язані записи
        $contentCount = Content::onlyTrashed()
            ->whereIn('user_id', $inactiveUsers)
            ->count();
 
        Content::whereIn('user_id', $inactiveUsers)
            ->forceDestroy();
        // Постійно видаляємо акаунти користувачів
        $userCount = User::forceDestroy($inactiveUsers);
        Log::info('Завершено видалення даних користувачів', [
            'users_removed' => $userCount,
            'content_removed' => $contentCount
        ]);
        UserDataPurged::dispatch($inactiveUsers);
 
        return [
            'users_purged' => $userCount,
            'content_purged' => $contentCount,
            'message' => "Успішно видалено {$userCount} неактивних акаунтів користувачів"
        ];
    }
}

Метод forceDestroy спрощує операції постійного видалення, роблячи ваш код більш чистим і ефективним при управлінні записами з м'яким видаленням