如何在laravel 5.4中检查模型使用软删除

时间:2017-08-03 07:48:02

标签: laravel model

我成为了一个模型服务特征,可以与所有模型一起使用

某些型号使用softDelete但有些型号不使用。

如何通过检查模型是否包含列deleted_at来检查模型是否具有softDeletes能力

这是我要检查的代码

$isSoftDeleted = \Schema::hasColumn($model->getTable(), 'deleted_at');

这是一个好方法吗?

2 个答案:

答案 0 :(得分:2)

另一种检查方法(更多一点原始)是检查方法forceDelete是否存在。

方法1 - 检查是否存在forceDelete 方法

if(method_exists($model, 'forceDelete')){
    // Do your stuff here
}

再次,这是一个小黑客。

方法2 - 使用界面

检查模型是否使用insanceof的特征通常不是最佳的,从技术上讲,创建接口UsesSoftDeletes并使模型实际使用SoftDeletes更合适trait实现它。这样做,您只需使用instanceof运算符进行检查。

一个例子:

interface UsesSoftDeletes{
    //
}

然后在你的模型中

class User extends Model implements UsesSoftDeletes
{

    use SoftDeletes;

}

然后检查

if($model instanceof UsesSoftDeletes){
    // Do your stuff here
}

编辑 - 检查全局范围

您还可以检查模型是否使用SoftDeletingScope类(Laravel 5.x)。

if($model->hasGlobalScope('Illuminate\Database\Eloquent\SoftDeletingScope')){
 // Do your stuff
}

答案 1 :(得分:1)

您可以使用class_uses_recursive(static::class)例如

$uses = class_uses_recursive(static::class);
return in_array(SoftDeletes::class, $uses);

检查列只能表明它存在,而不是您实际使用该特征。

请注意class_uses_recursive是使用内置class_uses但也升级为父类的Laravel辅助函数。