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

问题描述 投票:0回答:6

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

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

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

laravel model eloquent soft-delete
6个回答
12
投票

如果您想以编程方式检查模型是否使用软删除,您可以使用 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
}

3
投票

我需要检测模型上的软删除,其中该特征已包含在父类中,因此

class_uses()
对我不起作用。相反,我检查了
bootSoftDeletingTrait()
方法。大致如下:

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

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

应该可以。


2
投票

仅适用于 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));

0
投票

基本上没有直接的方法可以通过调用函数来了解模型是否软删除,因为方法

isSoftDeleting()
已从 4.2 中删除。如果您的模型类中存在
use SoftDeletingTrait;
以及数据库表中存在
deleted_at
列,您就知道模型是否正在使用软删除。

当您在模型的类中定义了

use SoftDeletingTrait
,并且在模型的数据库表中具有
deleted_at
(是时间戳)时,您基本上可以相信 Laravel 使用软删除从数据库中删除记录。


0
投票

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

首先我拨打这个电话:

$traits = class_uses($model);

然后我检查软删除特征

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

至少这样我就可以避免为我测试的每个模型调用数据库。尽管如果他们稍后更改 SoftDeletingTrait 名称或位置,它就会崩溃......


-1
投票

这是最好的方法

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

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

if($uses_soft_delete) {
    // write code...
}
© www.soinside.com 2019 - 2024. All rights reserved.