You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel与Eloquent软删除方案咨询:视图删记录不物理删数据

解决方案:Laravel软删除实现“假删除”需求

嘿,这个需求太常见啦,Laravel自带的**软删除(Soft Deletes)**功能刚好能完美解决你的问题!不用自己造轮子,跟着下面的步骤一步步来,新手也能轻松搞定:

1. 给数据库表添加软删除字段

首先需要给对应的表加一个deleted_at字段,用来标记记录是否被“删除”(实际是标记删除时间,未删除时为NULL)。

情况1:新建表的迁移

如果是刚创建表,直接在迁移文件里加入软删除字段:

Schema::create('your_table_name', function (Blueprint $table) {
    $table->id();
    // 其他业务字段...
    $table->softDeletes(); // 自动添加nullable的timestamp类型deleted_at字段
    $table->timestamps();
});

情况2:给已有表添加字段

如果表已经存在,先生成一个新的迁移文件:

php artisan make:migration add_deleted_at_to_your_table_name_table

然后在新迁移文件中编写字段添加逻辑:

public function up()
{
    Schema::table('your_table_name', function (Blueprint $table) {
        $table->softDeletes();
    });
}

public function down()
{
    Schema::table('your_table_name', function (Blueprint $table) {
        $table->dropSoftDeletes();
    });
}

最后执行迁移生效:

php artisan migrate

2. 在模型中启用软删除功能

找到对应的数据模型(比如app/Models/YourModel.php),引入SoftDeletes trait并启用:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; // 引入软删除trait

class YourModel extends Model
{
    use SoftDeletes; // 启用软删除特性

    // Laravel 8+版本可省略,框架会自动识别,但写上更兼容旧版本
    protected $dates = ['deleted_at'];
}

3. 调整视图展示的查询逻辑

启用软删除后,Eloquent默认会自动过滤掉已软删除的记录,所以你之前用来渲染视图的查询(比如YourModel::all()YourModel::where(...))会自动只返回未被“删除”的记录,完全不用修改原有查询代码!

如果需要在特定场景下显示已软删除的记录(比如管理员后台恢复数据),可以用这些方法:

  • YourModel::withTrashed()->get():获取所有记录(包括已软删的)
  • YourModel::onlyTrashed()->get():只获取已软删的记录

4. 实现视图上的“删除”操作

在控制器的删除方法里,你只需要像普通删除一样调用模型的delete()方法,Laravel会自动把deleted_at字段设为当前时间,而不是物理删除记录:

public function destroy($id)
{
    $record = YourModel::findOrFail($id);
    $record->delete(); // 这是软删除,仅标记删除时间,不会删除数据库记录

    return redirect()->back()->with('success', '记录已删除');
}

5. 补充:恢复已软删除的记录

如果客户后续需要恢复误删的记录,只需调用restore()方法:

// 恢复单条记录
$record = YourModel::withTrashed()->find($id);
$record->restore();

// 批量恢复符合条件的记录
YourModel::onlyTrashed()->where('some_column', 'target_value')->restore();

6. 真正的物理删除(可选)

如果确实需要彻底删除某条记录(比如清理无效数据),可以用forceDelete()方法:

$record = YourModel::withTrashed()->find($id);
$record->forceDelete();

这样就完美实现了客户要的“视图上删除记录但不物理删除”的需求啦,整个流程都是Laravel原生支持的,非常稳定可靠!

内容的提问来源于stack exchange,提问作者Prashanth

火山引擎 最新活动