【问题标题】:How to check model use soft delete in laravel 5.4如何在 laravel 5.4 中检查模型使用软删除
【发布时间】:2017-08-04 01:28:47
【问题描述】:

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

有些型号使用 softDelete,但有些没有。

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

这是我要检查的代码

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

这是一个好方法吗?

【问题讨论】:

标签: laravel model


【解决方案1】:

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

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

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

同样,这是一个小技巧。

方法 2 - 使用界面

通常使用insanceof 来检查模型是否使用特征并不是最佳选择,从技术上讲,创建接口UsesSoftDeletes 并让实际使用SoftDeletes 特征的模型实现它会更合适。这样做您可以简单地使用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
}

【讨论】:

  • $model->hasGlobalScope('Illuminate\Database\Eloquent\SoftDeletingScope') 为我工作,谢谢
【解决方案2】:

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

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

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

请注意,class_uses_recursive 是一个 Laravel 辅助函数,它使用内置的 class_uses,但也提升到父类。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2014-12-06
    • 2017-01-04
    • 2017-07-29
    相关资源
    最近更新 更多