关于软删除

软删除的SoftDeletes里面是
关于软删除
现在我的表是时间戳存储的默认是0,除了重写包的形式或者使用别人的包
能自己在model继承的时候重新定义呢?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6

你可能是从哪里看到null值对mysql查询性能有影响改成这样的吧,其实5.7以上版本已经对is null做了优化,这个你可以参考更新,如果仅仅是软删除的话其实查询影响不大,null只有范围搜索可能有一定的影响,而且有各种诡异情况发生,仅仅是 whereNull whereNotNull其实没什么性能隐患,你可以单表几亿条做下测试

4年前 评论
charming-xiaoxia (楼主) 4年前
Hanson 4年前
Epona

根据softDeletes的trait来自己写一个trait。。另外建议按照官方的指引来写软删除,能省很多事(比如你现在碰到的这个问题😂)

4年前 评论
charming-xiaoxia (楼主) 4年前
jenkincei

对,只需要在model 里重写这个方法就行了

4年前 评论
charming-xiaoxia (楼主) 4年前
jenkincei (作者) 4年前
charming-xiaoxia (楼主) 4年前
JaguarJack

重写类

class SoftDeletingScope extends \Illuminate\Database\Eloquent\SoftDeletingScope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where($model->getQualifiedDeletedAtColumn(), 0);
    }

在模型中 BOOT

public static function bootSoftDeletes()
{
     static::addGlobalScope(new SoftDeletingScope);
}
4年前 评论
charming-xiaoxia (楼主) 4年前
JaguarJack (作者) 4年前
charming-xiaoxia (楼主) 4年前
JaguarJack (作者) 4年前
charming-xiaoxia (楼主) 4年前
JaguarJack (作者) 4年前

我们之前也是这个问题,团队定义时间都得是时间戳,然后我找了一下包,发现也就俩文件,就没require进来。自己翻laravel代码,重写了两个文件,SoftDeletes(trait)和SoftDeletingScope(class),这俩文件里把所有是whereNull 的地方改成where($model->getQualifiedDeletedAtColumn(), '=', 0),因为你既然要用软删除,肯定还要用“查询被软删除的模型”,比如“包括被软删除的模型withTrashed()”,“只检索被软删除的模型onlyTrashed()”,“恢复被软删除的模型restore()”等等,这些肯定都要改
然后定义了个BaseModel

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Handlers\VSoftDeletes;

abstract class BaseModel extends Model
{
    // 软删除
    use VSoftDeletes;

    // 设置日期时间格式
    public $dateFormat = 'U';

    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at',
    ];
}
4年前 评论
kingjian 3年前

直接重写一个SoftDeletes的trait,然后在需要使用软删除的模型里面use就可以

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!