如何确定模型是否在Laravel 4.2中使用软删除

时间:2014-08-05 14:02:46

标签: laravel model eloquent soft-delete

如何确定模型是否在Laravel 4.2中使用软删除?

the Laravel API中,我发现函数isSoftDeleting(),但显然已经从Laravel 4.2中删除,因为它使用了SoftDeletingTrait。

我如何确定模型现在是否使用软删除?

6 个答案:

答案 0 :(得分:11)

如果要以编程方式检查模型是否使用软删除,可以使用PHP函数class_uses来确定模型是否使用SoftDeletingTrait

// You can use a string of the class name
$traits = class_uses('Model');
// Or you can pass an instance
$traits = class_uses($instanceOfModel);

if (in_array('SoftDeletingTrait', $traits))
{
    // Model uses soft deletes
}

// You could inline this a bit
if (in_array('SoftDeletingTrait', class_uses('Model')))
{
    // Model uses soft deletes
}

答案 1 :(得分:2)

我需要检测特性已被包含在父类中的模型上的软删除,因此class_uses()对我不起作用。相反,我检查了bootSoftDeletingTrait()方法。有点像:

// Class Name $usesSoftDeletes = method_exists('User', 'bootSoftDeletingTrait');

// Model Instance $usesSoftDeletes = method_exists($model, 'bootSoftDeletingTrait');

应该有用。

答案 2 :(得分:0)

由于方法isSoftDeleting()已从4.2中删除,因此通过调用函数来了解模型软件是否删除时,基本上没有直接的方法。如果模型类中存在use SoftDeletingTrait;并且数据库表中存在deleted_at列,则表示模型是否正在使用软删除。

当您在模型类中定义use SoftDeletingTrait并拥有deleted_at(是TIMESTAMP)时,您基本上可以信任Laravel使用软删除从数据库中删除记录在您的模型的数据库表中。

答案 3 :(得分:0)

好吧,我找到了一个足够好的解决方案来满足我的需求。

首先我打这个电话:

$traits = class_uses($model);

然后我检查softdeletingtrait

$usesSoftDeletes = in_array('Illuminate\Database\Eloquent\SoftDeletingTrait', $traits);

至少这样我就不必为我测试的每个模型调用数据库。虽然如果他们稍后更改SoftDeletingTrait名称或位置会中断...

答案 4 :(得分:0)

仅适用于Laravel 5.x

如果检查主模型:

//class_uses retrieves a list of traits from the object passed into an array
//Hence in_array check for name of trait (in string format)
//@param bool $usesSoftDeletes

$usesSoftDeletes = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($model));

如果您正在检查主模型的关系,请使用以下内容:

//Replace `myRelationshipName` by the name of the relationship you are checking on.
//getRelated() function fetches the class of the relationship.
//@param bool $relatedUsesSoftDeletes

$relatedModel = $model->myRelationshipName()->getRelated();
$relatedUsesSoftDeletes = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($relatedModel));

答案 5 :(得分:-1)

这是最好的方法

$model = 'App\\Models\\ModelName';

$uses_soft_delete = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($model));

if($usesSoftDeletes) {
    // write code...
}