我成为了一个模型服务特征,可以与所有模型一起使用
某些型号使用softDelete但有些型号不使用。
如何通过检查模型是否包含列deleted_at
来检查模型是否具有softDeletes能力
这是我要检查的代码
$isSoftDeleted = \Schema::hasColumn($model->getTable(), 'deleted_at');
这是一个好方法吗?
答案 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辅助函数。