内のスコープの一部ではありません関係:この複雑な条件が有効と考えられているFoo
内のすべてのレコードを選択しますクエリ私はそうのような複雑な範囲の条件を持っているモデルの場合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);
});
}
}
(実際の範囲はそれよりもさらに複雑です)。
私はそうのような別のクラスを持っている:
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_に 'too old'というクエリを照会し、 'is_active'属性をfalseに設定します。次に、単純なスコープを使用して_model_がアクティブであるかどうかを判断することができます。 – Jeffrey