Eloquent ORM,使用软删除时deleted_at没有索引

laravel

1个回答

写回答

vip5200

2025-06-17 10:55

+ 关注

Laravel
Laravel

使用Eloquent ORM进行数据库操作是Laravel框架中的一种强大的工具。其中一个非常实用的功能是软删除,即在数据库中标记记录为已删除而不是物理删除。然而,在使用软删除功能时,我发现一个问题是deleted_at字段没有默认的索引。

当我们使用软删除功能时,Eloquent ORM会自动在数据库表中添加一个名为deleted_at的字段,并将已删除的记录的该字段值设置为对应的时间戳。这样,我们就可以轻松地过滤出已删除的记录,同时保留了数据的完整性。

然而,由于deleted_at字段没有默认的索引,当我们对大量数据进行软删除并进行查询操作时,可能会导致性能下降。因为没有索引的支持,数据库引擎需要遍历整个表来查找符合条件的记录,而不是利用索引快速定位。

为了解决这个问题,我们可以手动给deleted_at字段添加索引。在Laravel中,我们可以使用迁移来修改数据库表结构。下面是一个示例代码:

php

use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\FaCADes\Schema;

class AddIndexToDeletedAtColumn extends Migration

{

public function up()

{

Schema::table('your_table_name', function (Blueprint $table) {

$table->index('deleted_at');

});

}

public function down()

{

Schema::table('your_table_name', function (Blueprint $table) {

$table->dropIndex('your_table_name_deleted_at_index');

});

}

}

上述代码中,我们使用Laravel提供的Schema类来对表结构进行修改。在up()方法中,我们使用index()方法为deleted_at字段添加了索引。在down()方法中,我们使用dropIndex()方法来删除该索引。

通过手动添加索引,我们可以显著提高软删除功能的性能。数据库引擎现在可以利用索引快速定位符合条件的记录,而不需要遍历整个表。

案例代码:

php

// 定义一个模型类

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model

{

use SoftDeletes;

protected $dates = ['deleted_at'];

}

在上述代码中,我们定义了一个名为User的模型类,并使用了SoftDeletes trAIt。这个trAIt是Laravel提供的,它会自动为模型添加软删除功能。

当我们使用这个模型类进行查询时,Eloquent ORM会自动过滤掉已删除的记录。例如,我们可以这样查询未删除的用户:

php

$users = User::whereNull('deleted_at')->get();

上述代码中,我们使用了whereNull()方法来过滤掉deleted_at字段不为空的记录,从而得到未删除的用户。

,虽然使用Eloquent ORM的软删除功能非常方便,但在性能上可能会受到deleted_at字段没有索引的影响。通过手动添加索引,我们可以提高软删除功能的性能,从而更好地应对大量数据的查询操作。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号