Laravel:行为类似于软删除的活动列

Laravel: active column that behave like softdelete

我在 Laravel 中有一个使用软删除的模型帐户。 除此之外,我想要另一个名为 active 的列,它的行为有点相同。如果它设置为 XXX,则所有 Account:: 调用不应将它们包含在 return 中。在我将活动值设置为 YYY 之前,在此之后,它们应该被包括在内。 有什么办法吗? 我想自己设置 XXX 和 YYY 值。所以我可以说 return 仅当 active = 1 或 active = whatEverIWant

编辑:我知道我可以通过在每次调用时检查值来做到这一点,但我已经在很多地方使用了这些帐户,不想在任何地方都添加它

可以通过两种方式接近

选项 1:全局范围

您可以在模型上定义一个全局范围,returns 仅记录活动设置为 1

class Account extends Model
{

    protected static function booted()
    {
        static::addGlobalScope('active', function (Builder $builder) {
            $builder->where('active', 1);
        });
    }

    // rest of the class code
}

现在模型上的所有查询都将具有在全局范围内定义的约束。

当您确实想要检索记录时,无论 active 是否设置为 1,您都可以使用 withoutGlobalScopes()withoutGlobalScope('active') 调用它 - 将删除全局范围内定义的约束。

$accounts = Account::withoutGlobalScopes()->get();

//OR

$accounts = Account::withoutGlobalScope('active');

选项 2:本地作用域

您可以在模型上为每个活动和非活动状态class定义一个本地范围

class Account extends Model
{
    public function scopeActive($query)
    {
        $query->where('active', 1);
    }

    public function scopeInactive($query)
    {
        $query->where('active', '<>', 1);
    }
}

然后当你想过滤活跃或不活跃的记录时

$activeAccounts = Account::active()->get();

$inactiveAccounts = Account::inactive()->get();

$accounts = Account::get(); //to get all records irrespective of whether active or inactive

Laravel 软删除也在幕后使用作用域。

Laravel 文档:https://laravel.com/docs/master/eloquent#query-scopes