当前位置:  开发笔记 > 编程语言 > 正文

在模型中使用引导方法时,SoftDeletes不过滤

如何解决《在模型中使用引导方法时,SoftDeletes不过滤》经验,为你挑选了1个好方法。

我有一个Model在Laravel中使用软删除的,并且还使用了一个包含boot函数的特征:

class Design extends Model {
    uses Softdeletes, Versionable;
    // ...
}

trait Versionable {
    public static function boot(){
    // ...
    }
}

SoftDeletes本身仍然可以正常工作:delete_at列已正确填充。但是,Designs::get()不能正确过滤软删除的模型:

return Designs::get();

[{"id":1,"project_id":1,"name":"","description":null,"created_at":"2015-12-04 21:06:40","updated_at":"2015-12-04 21:06:40","deleted_at":null},
 {"id":2,"project_id":1,"name":"A Design","description":"a different description", "created_at":"2015-12-04 21:06:57","updated_at":"2015-12-04 21:07:09","deleted_at":"2015-12-04 21:07:09"}]

从Versionable中删除Versionable特征或boot方法可以解决此问题。

为什么会发生这种情况,我该如何解决?



1> Thomas Kim..:

首先,我将假设您没有调用parent::boot();特征的boot方法,这就是为什么出现此问题的原因。您将覆盖父级的引导方法。但是,出于某些原因,我不建议使用这种方法,而Laravel实际上建议在向特性添加引导方法时使用标准的命名约定。

如果特征具有boot方法,它将覆盖父模型的boot方法。您可以parent::boot();在特征的boot方法中添加一个方法来解决此问题,以便它也可以调用父级的boot方法。但是,如果您的模型具有boot方法,则基本上会删除特征的boot方法。在您的特征中添加引导方法会产生潜在的冲突,无论是现在,以后还是其他人尝试使用您的特征。

为了解决此问题,Laravel建议您以以下格式命名特征的引导方法:boot{TraitName}

换句话说,您的Trait被调用,Versionable因此,如果您将启动方法重命名为以下代码,则代码将起作用:

public static function bootVersionable(){
    // ...
}

编辑:源

如果Eloquent模型使用的特征具有与bootNameOfTrait命名约定匹配的方法,则在启动Eloquent模型时将调用该trait方法,从而使您有机会注册全局范围或执行任何其他所需的操作。

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有