【问题标题】:How to determine if a model uses soft deletes in Laravel 4.2如何确定模型是否在 Laravel 4.2 中使用软删除
【发布时间】:2014-09-28 05:32:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: laravel model eloquent soft-delete


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我知道我可以检查数据库中的“deleted_at”列,但我希望避免这种情况。我的回答提供了另一种解决方案。
    【解决方案2】:

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

    【讨论】:

    • 谢谢,您实际上回答了我在写自己的答案的同时。我会将您的答案标记为答案,因为它与我的基本相同。但是我发现当我使用 class_uses() 时,它返回了一个包含整个命名空间的数组,而不仅仅是 SoftDeletingTrait,所以这就是我必须寻找的:'Illuminate\Database\Eloquent\SoftDeletingTrait'
    【解决方案3】:

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

    首先我打这个电话:

    $traits = class_uses($model);
    

    然后我检查softdeletingtrait

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      应该可以。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          这是最好的方法

          $model = 'App\\Models\\ModelName';
          
          $uses_soft_delete = in_array('Illuminate\Database\Eloquent\SoftDeletes', class_uses($model));
          
          if($uses_soft_delete) {
              // write code...
          }
          

          【讨论】:

          • 这比现有答案没有任何改进
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-19
          • 1970-01-01
          • 2017-01-04
          • 2015-05-12
          • 1970-01-01
          • 2018-06-19
          • 2013-10-27
          相关资源
          最近更新 更多