一個範圍對於模型我有一個複雜的範圍條件,像這樣的一部分:查詢的關係,是不是在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