PHP项目Laravel restore恢复软删数据

wen PHP项目 6

本文目录导读:

PHP项目Laravel restore恢复软删数据

  1. 基础恢复方法
  2. 在 Service 或 Repository 层封装
  3. 在 Controller 中使用
  4. 带关联数据的恢复
  5. 使用请求验证和路由
  6. 前端使用方法
  7. 高级技巧
  8. 注意事项

在 Laravel 中恢复软删除的数据有几种方法,我来详细介绍:

基础恢复方法

使用 restore() 方法恢复单个模型

use App\Models\User;
// 找到软删除的数据并恢复
$user = User::withTrashed()->find($id);
$user->restore();

恢复多个软删除的数据

// 恢复所有软删除的用户
User::onlyTrashed()->restore();
// 恢复指定条件的软删除数据
User::onlyTrashed()
    ->where('deleted_at', '>=', now()->subDays(7))
    ->restore();

在 Service 或 Repository 层封装

<?php
namespace App\Services;
use App\Models\User;
use Illuminate\Support\Facades\DB;
class UserService
{
    /**
     * 恢复单个用户
     */
    public function restoreUser(int $id): bool
    {
        try {
            DB::beginTransaction();
            $user = User::withTrashed()->findOrFail($id);
            $user->restore();
            DB::commit();
            return true;
        } catch (\Exception $e) {
            DB::rollBack();
            throw $e;
        }
    }
    /**
     * 批量恢复用户
     */
    public function restoreMultipleUsers(array $ids): int
    {
        return User::withTrashed()
            ->whereIn('id', $ids)
            ->restore();
    }
    /**
     * 恢复指定时间前的数据
     */
    public function restoreBeforeDate(string $date): int
    {
        return User::withTrashed()
            ->where('deleted_at', '<', $date)
            ->restore();
    }
}

在 Controller 中使用

<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Services\UserService;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class UserController extends Controller
{
    protected $userService;
    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }
    /**
     * 恢复单个用户
     */
    public function restore(Request $request, $id): JsonResponse
    {
        try {
            $result = $this->userService->restoreUser($id);
            return response()->json([
                'success' => true,
                'message' => '用户恢复成功',
                'data' => $result
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '恢复失败:' . $e->getMessage()
            ], 500);
        }
    }
    /**
     * 批量恢复用户
     */
    public function batchRestore(Request $request): JsonResponse
    {
        $request->validate([
            'ids' => 'required|array',
            'ids.*' => 'integer'
        ]);
        try {
            $count = $this->userService->restoreMultipleUsers($request->ids);
            return response()->json([
                'success' => true,
                'message' => "成功恢复 {$count} 个用户"
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => '批量恢复失败:' . $e->getMessage()
            ], 500);
        }
    }
}

带关联数据的恢复

class UserService
{
    /**
     * 恢复用户及其关联数据(带关联的软删除)
     */
    public function restoreUserWithRelations(int $id): bool
    {
        $user = User::withTrashed()
            ->with(['posts' => function ($query) {
                $query->withTrashed();
            }])
            ->findOrFail($id);
        // 恢复关联数据(如果关联模型也使用了软删除)
        foreach ($user->posts as $post) {
            if ($post->trashed()) {
                $post->restore();
            }
        }
        // 恢复主模型
        $user->restore();
        return true;
    }
}

使用请求验证和路由

// routes/api.php
Route::post('/users/{id}/restore', [UserController::class, 'restore']);
Route::post('/users/batch-restore', [UserController::class, 'batchRestore']);

前端使用方法

// 使用 Axios 调用
async function restoreUser(userId) {
    try {
        const response = await axios.post(`/api/users/${userId}/restore`);
        console.log('恢复成功:', response.data);
        return response.data;
    } catch (error) {
        console.error('恢复失败:', error.response.data);
        throw error;
    }
}
async function batchRestoreUsers(userIds) {
    try {
        const response = await axios.post('/api/users/batch-restore', {
            ids: userIds
        });
        console.log('批量恢复成功:', response.data);
        return response.data;
    } catch (error) {
        console.error('批量恢复失败:', error.response.data);
        throw error;
    }
}

高级技巧

条件软删除模型

class User extends Model
{
    use SoftDeletes;
    protected $dates = ['deleted_at'];
    // 获取还包含已删除记录的数据
    public function scopeWithDeleted($query)
    {
        return $query->withTrashed();
    }
    // 获取仅软删除的数据
    public function scopeOnlyDeleted($query)
    {
        return $query->onlyTrashed();
    }
}

事件监听

class User extends Model
{
    use SoftDeletes;
    protected static function booted()
    {
        static::restoring(function ($user) {
            // 恢复前操作
            Log::info('用户即将被恢复', ['id' => $user->id]);
        });
        static::restored(function ($user) {
            // 恢复后操作
            Log::info('用户已恢复', ['id' => $user->id]);
        });
    }
}

注意事项

  1. 权限检查:恢复操作前要检查用户是否有权限
  2. 事务处理:涉及多个操作时使用事务
  3. 日志记录:记录恢复操作日志
  4. 关联检查:恢复前检查关联数据的状态
  5. 唯一性验证:恢复后可能需要验证唯一字段不冲突
public function restoreUser(int $id): bool
{
    return DB::transaction(function () use ($id) {
        $user = User::withTrashed()->findOrFail($id);
        // 权限检查
        if (!auth()->user()->can('restore', $user)) {
            abort(403, '无权恢复该用户');
        }
        // 检查唯一性
        $emailExists = User::where('email', $user->email)
            ->where('id', '!=', $id)
            ->exists();
        if ($emailExists) {
            throw new \Exception('邮箱已被其他用户使用');
        }
        $user->restore();
        // 记录日志
        activity()
            ->performedOn($user)
            ->log('用户已恢复');
        return true;
    });
}

这样就能安全、完整地实现软删除数据的恢复功能了。

抱歉,评论功能暂时关闭!