Для модели I имеет сложное состояние сферы, как так:запросов отношение, которые не является частью сферы в Laravel
class Foo {
public function scopeActive(Builder $query) {
$dateNow = $now->format('Y-m-d');
$timeNow = $now->second(0)->format('H:i:s');
$query->whereNull('start_date')
->orWhere('start_date', '<', $dateNow)
->orWhere(function (Builder $query) use ($dateNow, $timeNow) {
$query->where('start_date', '=', $dateNow)
->where('start_time', '>=', $timeNow);
});
}
}
Это сложное условие будет выбрать все записи в Foo
, которые считаются активными (реальный охват еще сложнее, чем это).
У меня есть еще один класс так:
class Bar {
public function foos() {
return $this->hasMany(Foo::class);
}
}
что означает Bar
модель имеет много Foo
моделей.
Теперь, если я хочу, чтобы получить все Bar
модели, а также все активные Foo
модели, которые принадлежат к ней, я могу сделать следующее:
Bar::with(['foo', function (HasMany $query) {
$query->active();
})->get();
Однако, как я могу написать запрос, который дает меня все Bar
записей, которые НЕ активны.
В идеале я хотел бы что-то вроде этого:
Bar::with(['foo', function (HasMany $query) {
$query->whereNot(function (Builder $query) {
$query->active();
});
})->get();
Я отредактировал его немного, чтобы дать представление о сложном пространстве. Реальный еще сложнее. Поэтому я не хочу повторять его снова –
К сожалению, нет возможности инвертировать области. Это означает, что вам придется написать тот же сложный запрос, но с инвертированной логикой. – Jeffrey
Лучшей идеей было бы сделать следующее: Добавить дополнительный атрибут вашей модели (например, 'is_active'). Затем настройте расписание, которое регулярно обновляет вашу базу данных. Например: каждый час запрашивайте все _models_, которые являются «слишком старыми» и присваивают атрибуту 'is_active' значение false. Затем вы сможете использовать простую область для определения того, активен ли ваш _model_. – Jeffrey