Laravel查询:添加自定义功能,例如软删除

时间:2019-03-15 17:05:36

标签: php laravel eloquent query-builder

我所有的表都有一个名为isTest的列。我想要的是能够设置一个开关,以便我的代码将包括查询中的所有记录,或者[更重要的是]排除isTest为true的所有记录。

我想该代码将类似于软删除,并包含类似于:Eloquent和查询生成器生成的SQL的sql代码: AND(isTest!= TRUE)

我不太了解口才事件,但是我发现这个question可能是开始的正确位置,但是我希望在开始之前可以得到指导。另外,它没有有关查询生成器的信息。如果有人做了类似的事情,我会建议您。

1 个答案:

答案 0 :(得分:0)

您正在寻找全局范围,可以添加一个自定义范围,该范围将检查isTest的值。

<?php


// Your custom scope
namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class IsTestScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('isTest', true);
    }
}


// Your model
namespace App;

use App\Scopes\IsTestScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        // Check for certain criteria, like environment
        if (App::environment('local')) {
            // The environment is local
            static::addGlobalScope(new IsTestScope);
        }
    }
}

当您有很多模型时,您想使这段代码具有特征,因此您不必一直重复它。就像SoftDeletes的工作方式一样。

有关更多信息,请参见文档https://laravel.com/docs/5.8/eloquent#global-scopes

相关问题