2017-02-03 1 views
0

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(); 

Antwort

0

Es scheint nicht ein zu sein effiziente Möglichkeit zum einfachen Invertieren von SQL mit Laravel für komplizierte Abfragen.

Sie müssen nur die Umkehrung schreiben.

0

Wenn Sie einen Bereich haben wollen, dass das Gegenteil der Fall ist, nur ein weiterer Anwendungsbereich Methode erstellen, wie so, aber mit umgekehrtem Abfragelogik (Sie nicht enthalten Ihre 'Einige komplizierte Abfrage', so ist dies nur eine Vermutung):

public function scopeInactive($query) { 
    return $query->where('is_active', false); 
} 

Laravel: local scopes

+0

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 –

+0

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

+0

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