#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. Большое вам спасибо, именно то, что я искал. Но не знал об областях