📅  最后修改于: 2023-12-03 14:43:50.640000             🧑  作者: Mango
在Laravel中,软删除是一种常用的数据库操作,它允许我们在删除记录时,将其标记为已删除,而不是直接从数据库中删除记录。这个特性保留了删除记录的历史记录,同时还可以避免一些错误的数据操作,比如无意中删除了重要的记录。
在Laravel中,软删除是通过在模型中使用 SoftDeletes
trait 来实现的。这个trait定义了两个字段:deleted_at
和 restore
,分别用于标记记录是否已经被删除,以及恢复被删除的记录。
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $fillable = ['name', 'email', 'password'];
}
在模型中使用SoftDeletes trait后,我们就可以使用 delete
方法来软删除记录。
$user = User::find(1);
$user->delete();
软删除的默认行为是将 deleted_at
字段设为当前时间戳。我们也可以使用 forceDelete
方法来硬删除记录。
$user = User::find(1);
$user->forceDelete();
但有时候我们需要恢复已删除的记录,这时可以使用 restore
方法。
$user = User::onlyTrashed()
->where('email', 'deleted_user@example.com')
->first();
$user->restore();
在使用软删除时,我们需要注意一些细节。比如查询记录时,需要使用 withTrashed
和 onlyTrashed
方法来查询已被软删除的记录:
$users = User::withTrashed()
->where('name', 'John')
->get();
$deletedUsers = User::onlyTrashed()
->where('email', 'deleted_user@example.com')
->get();
另外,我们还需要在数据库表中添加一个名为 deleted_at
的字段,用于存储删除时间。可以使用 Laravel 的迁移功能来添加该字段。
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddDeletedAtColumnToUsersTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->timestamp('deleted_at')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('deleted_at');
});
}
}
总之,Laravel提供了非常方便易用的软删除功能,能够帮助我们更好地管理数据库记录。无论是从数据保护的角度还是从历史记录的角度,都是十分有价值的特性。