使用模型可以自定义软删除字段吗

1. 在模型中使用 HasFactory 软删除功能 laravel8.5 中默认为 deleted_at 时间戳格式
2. 我想在模型中自定义 删除字段 如 我的删除字段 is_del 1 未删除 2 已删除
3. 我想实现这种 需要怎么修改模型或者需要怎么定义

最终想实现的效果例如 tp6.0 中

目前我在 laravel8.5 中写的方式

我想省略其中的 where (‘is_del’,1)

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

直接在你的模型里像这样定义一下字段名称就可以了:

CONST DELETED_AT = "is_del"

文档里没有提到,不过看看源码比文档更直接

/**
 * Get the name of the "deleted at" column.
 *
 * @return string
 */
 public function getDeletedAtColumn()
 {
     return defined('static::DELETED_AT') ? static::DELETED_AT : 'deleted_at';
 }
3年前 评论

原本 deleted_at 是个时间字段,你这个 is_del 是个整形字段
你可以看下 vendor/laravel/framework/src/Illuminate/Database/Eloquent/SoftDeletes.php
这个 trait 里的方法是不是满足你的使用,不行的话就重写一些方法 ,然后用你自己的 trait

3年前 评论

用 laravel 还是用推荐做法,除非真是特殊需求,给后人留下好印象,反人类设计有时候会兼顾更多逻辑

3年前 评论

在 baseModel 里重写构造方法可以实现

public function __construct(array $attributes = [])
{ parent::__construct($attributes);

    // 生成sql时自动拼接is_del查询参数
    static::addGlobalScope('is_del', function (EloquentBuilder $builder) use ($domain) {
        $builder->where($this->getTable() . '.is_del', '=', 1);
    });
}
3年前 评论