Für ein Modell einen komplizierten Umfang Zustand wie ich habe so ist:Abfrage eine Beziehung, die nicht Teil eines Umfang in 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);
});
}
}
Dieser komplizierte Zustand wird alle Datensätze in Foo
aus, die aktiv in Betracht gezogen werden (die Der tatsächliche Umfang ist noch komplizierter als das).
Ich habe eine andere Klasse wie folgt:
class Bar {
public function foos() {
return $this->hasMany(Foo::class);
}
}
Was bedeutet das Bar
Modell viele Foo
Modelle hat.
Nun, wenn ich alle Bar
Modelle sowie alle aktiven Foo
Modelle, die zu ihr gehören, bekommen wollte kann ich folgendes tun:
Bar::with(['foo', function (HasMany $query) {
$query->active();
})->get();
Doch wie kann ich schreiben Sie eine Abfrage, gibt mir alle Bar
Datensätze, die nicht aktiv sind.
Idealerweise würde ich so etwas wie dies wollen:
Bar::with(['foo', function (HasMany $query) {
$query->whereNot(function (Builder $query) {
$query->active();
});
})->get();
Ich habe es leicht bearbeitet, um eine Vorstellung von dem komplizierten Umfang zu geben. Der echte ist noch komplexer. Daher möchte ich es nicht noch einmal wiederholen –
Leider gibt es keine Möglichkeit, Bereiche zu invertieren. Das bedeutet, dass Sie genau dieselbe komplizierte Abfrage schreiben müssen, aber mit umgekehrter Logik. – Jeffrey
Eine bessere Idee wäre, folgendes zu tun: Fügen Sie Ihrem Modell ein zusätzliches Attribut hinzu (zB 'is_active'). Richten Sie dann einen Zeitplan ein, der Ihre Datenbank regelmäßig aktualisiert. Zum Beispiel: jede Stunde alle _models_ abfragen, die zu alt sind, und ihr Attribut 'is_active' auf 'false' setzen. Dann können Sie mit einem einfachen Bereich feststellen, ob Ihr _Modell_ aktiv ist oder nicht. – Jeffrey