You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel模型中编写支持批量操作的自定义remove方法?

解决Laravel自定义remove()方法无法批量调用的问题

你写的remove()是模型实例方法,只能在单个User对象上调用(比如User::find(1)->remove());而User::whereIn('id', [1,2,3])返回的是Eloquent查询构建器(Builder实例),不是单个模型对象,所以没法直接调用这个方法。下面是几种直接可行的解决办法:

方案一:注册全局查询构建器宏(推荐)

这种方式能让所有Eloquent模型的查询构建器都支持链式调用remove(),和原生delete()的使用逻辑完全一致。

在项目的App\Providers\AppServiceProvider.php的boot()方法中添加代码:

use Illuminate\Database\Eloquent\Builder;

public function boot()
{
    Builder::macro('remove', function () {
        return $this->update([
            'expired_at' => now()->addYear()
        ]);
    });
}

添加后,你就可以直接使用User::whereIn('id', [1,2,3])->remove()实现批量更新,和原生批量删除的调用方式完全匹配。

方案二:在User模型内添加专属静态方法

如果只需要给User模型添加批量更新能力,不想全局生效,可以在User.php模型文件里添加静态方法:

方式1:支持传入查询构造器

public static function removeBatch($query)
{
    return $query->update([
        'expired_at' => now()->addYear()
    ]);
}

调用示例:

User::removeBatch(User::whereIn('id', [1,2,3]));

方式2:直接接收ID数组

public static function batchRemove(array $ids)
{
    return static::whereIn('id', $ids)->update([
        'expired_at' => now()->addYear()
    ]);
}

调用示例:

User::batchRemove([1,2,3]);

进阶:仅给User模型添加链式remove()方法

如果要严格限制只有User模型的查询构建器能调用remove(),可以重写User模型的newEloquentBuilder方法:

use Illuminate\Database\Eloquent\Builder;

public function newEloquentBuilder($query)
{
    $builder = parent::newEloquentBuilder($query);
    $builder->macro('remove', function () {
        return $this->update([
            'expired_at' => now()->addYear()
        ]);
    });
    return $builder;
}

这样其他模型的查询构建器不会有remove()方法,只有User模型可以用User::whereIn('id', [1,2,3])->remove()。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:25:16