新闻中心

Lar*el软删除如何实现_Lar*el SoftDeletes使用详解

2025-12-09
浏览次数:
返回列表
Lar*el的软删除通过SoftDeletes trait实现,模型引入该trait并添加deleted_at字段即可标记删除而不移除记录,便于数据恢复与完整性维护。

laravel软删除如何实现_laravel softdeletes使用详解

Lar*el 的软删除(Soft Deletes)是一种优雅的方式,用来标记数据为“已删除”,而不会真正从数据库中移除记录。这样可以在需要时恢复数据,同时保持数据完整性。Lar*el 通过 SoftDeletes trait 提供了开箱即用的支持,使用起来非常简单。

启用软删除功能

要在模型中启用软删除,只需在对应的 Eloquent 模型中引入 Illuminate\Database\Eloquent\SoftDeletes trait,并确保数据表包含一个 deleted_at 字段。

示例:启用软删除的 User 模型

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at']; // 可选:如果使用 $dates,可直接操作 Carbon 实例
}

注意: Lar*el 6+ 中,$dates 属性不再是必须的,Eloquent 会自动识别 deleted_at 为日期类型。

数据库迁移中添加 deleted_at 字段

要支持软删除,数据表必须包含一个 nullable 的 deleted_at 字段。可以使用迁移文件中的 softDeletes() 方法来添加它。

示例:创建用户表并添加软删除字段

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('deleted_at')->nullable(); // 手动写法
            // 或者使用下面这行:
            // $table->softDeletes();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

提示: 使用 $table->softDeletes(); 是更简洁的方式,它会自动生成一个 nullable 的 timestamp 类型的 deleted_at 字段。

执行软删除与恢复

一旦模型启用了软删除,调用 delete() 方法不会真正删除记录,而是将 deleted_at 设置为当前时间。

示例:执行软删除

$user = User::find(1);
$user->delete(); // 此时 deleted_at 被设置,数据仍在数据库中

要恢复已被软删除的记录,可以调用 restore() 方法。

Songtell Songtell

Songtell是第一个人工智能生成的歌曲含义库

Songtell 164 查看详情 Songtell 示例:恢复已删除的记录

$user = User::withTrashed()->find(1);
$user->restore(); // 恢复数据,deleted_at 设为 null

说明:

  • delete():设置 deleted_at 时间戳
  • restore():清除 deleted_at,恢复数据
  • forceDelete():彻底删除记录,绕过软删除

查询软删除数据

默认情况下,启用了软删除的模型查询会自动排除已被删除的记录。但你可以使用以下方法控制查询行为:

  • withTrashed():包含已被软删除的记录
  • onlyTrashed():只查询已被软删除的记录
  • withoutTrashed():排除软删除数据(默认行为)
示例:不同查询方式

// 获取所有用户,包括已删除的
$users = User::withTrashed()->get();

// 只获取已删除的用户
$trashedUsers = User::onlyTrashed()->get();

// 恢复某个已删除用户
User::onlyTrashed()->where('email', 'test@example.com')->restore();

强制删除(永久删除)

如果你确定要永久删除某条记录,可以使用 forceDelete() 方法。

$user = User::find(1);
$user->forceDelete(); // 数据从数据库中彻底删除

对已经软删除的数据再次调用 forceDelete() 也会将其永久移除。

软删除事件

Lar*el 的软删除会触发特定的模型事件:

  • deletingdeleted:在 delete() 调用时触发(软删除也触发)
  • restoringrestored:在 restore() 调用时触发

你可以在模型中监听这些事件,用于清理关联数据或记录日志。

protected static function booted()
{
    static::deleted(function ($user) {
        // 删除用户时,清理其文章草稿
        $user->drafts()->delete();
    });

    static::restored(function ($user) {
        // 恢复用户时,重新激活其账号状态
        $user->update(['status' => 'active']);
    });
}

基本上就这些。软删除在实际项目中非常实用,比如用户注销、内容回收站等场景。只要记得加字段、用 trait、理解查询作用域,就能轻松掌握。

以上就是Lar*el软删除如何实现_Lar*el SoftDeletes使用详解的详细内容,更多请关注其它相关文章!


# 发送邮件  # 湖南seo服务有哪些  # 贵州网站建设者  # 沧州网站定制推广公司  # 随州营销型网站建设开发  # 怎样做好新网站优化策略  # 农产品网络营销推广策略  # 无锡网站建设详细内容  # 南平网站推广哪家强  # 薯条营销推广策略  # 新站seo漯河联系电话  # laravel  # 何为  # 自定义  # 分页  # 如何实现  # 移除  # 数据库中  # 可以使用  # 已被  # 数据恢复  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  知音漫客正版漫画平台_知音漫客官网账号登录  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  高德地图怎么看全景照片_高德地图全景照片浏览教程  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  J*aScript数组对象转换:按指定键分组与值收集  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  CSS布局中意外空白:解决padding-top导致的顶部间距问题  在Runstone环境中高效处理TasteDive API的JSON数据  c++中为什么推荐使用using替代typedef_c++现代化类型别名  必由学官方平台入口 必由学在线课堂登录地址  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  解决Django多数据库/多Schema环境下外键迁移问题  支付宝如何设置安全保护_支付宝安全设置的全面教程  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  菜鸟取件码是什么怎么查 最全查询渠道汇总  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  Bing引擎入口最新2025 Bing搜索免费官方登录  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  HTML长属性值处理:表单action路径优化与代码规范应对  优化Django表单:提交验证失败后保留用户输入  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  如何使用纯J*aScript判断Input元素是否在特定类容器内  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  深入理解J*a编译器的兼容性选项:从-source到--release  期待已久:小米17 Ultra、小米首款NAS本月登场  ACG动漫视频网入口 ACG动漫*免费正版观看地址  Fabric模组开发:自定义物品与物品组的现代管理方法  ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  不同用户不同价格! 索尼开启账户个性化定价测试  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  Python模块化编程:有效管理依赖与避免循环引用  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  德邦快递查询平台 德邦快递物流信息查询入口  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相 

搜索