关于软删除

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6

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

2周前 评论
charming-xiaoxia (楼主) 2周前
Hanson 2周前
Epona

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

2周前 评论
charming-xiaoxia (楼主) 2周前
jenkincei

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

2周前 评论
charming-xiaoxia (楼主) 2周前
jenkincei (作者) 2周前
charming-xiaoxia (楼主) 2周前
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);
}
2周前 评论
charming-xiaoxia (楼主) 2周前
JaguarJack (作者) 2周前
charming-xiaoxia (楼主) 2周前
JaguarJack (作者) 2周前
charming-xiaoxia (楼主) 2周前
JaguarJack (作者) 2周前

我们之前也是这个问题,团队定义时间都得是时间戳,然后我找了一下包,发现也就俩文件,就没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',
    ];
}
2周前 评论

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

2周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!