Laravel: активный столбец, который ведет себя как softdelete

#laravel #laravel-models

#laravel #laravel-модели

Вопрос:

У меня есть модель учетных записей в Laravel, которая использует Softdeletes. Кроме того, я хочу, чтобы другой столбец назывался активным, который ведет себя примерно так же. Если его значение равно XXX, то все Account:: вызовы не должны включать их в возврат. Пока я не установлю активное значение в YYY, после этого они должны быть включены. Есть ли какой-нибудь способ сделать это? Я хочу установить значения XXX и YYY самостоятельно. Поэтому я мог бы сказать return только в том случае, если active = 1 или active = whatEverIWant

Редактировать: я знаю, что мог бы сделать это, проверяя значение при каждом вызове, но я уже использую учетные записи во многих местах и не хочу добавлять их везде

Ответ №1:

К нему можно подойти двумя способами

Вариант 1: глобальная область

Вы можете определить глобальную область видимости в модели, которая возвращает записи только с активным значением 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 not, вы можете вызвать его с withoutGlobalScopes() помощью или withoutGlobalScope('active') — удалит ограничение, определенное в глобальной области.

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

//OR

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

Вариант 2: локальная область

Вы можете определить локальную область в классе модели для каждого из активных и неактивных состояний

 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 softdeletes также использует области за кулисами.

Документы Laravel: https://laravel.com/docs/master/eloquent#query-scopes

Комментарии:

1. Большое вам спасибо, именно то, что я искал. Но не знал об областях