2015-06-19 16 views
6

Mein Verband Modell wie dieses (irrelevant Code redigiert) Mit aussieht:einen Abfragebereich in einer Sammlung Laravel

class Association extends Model 
{ 
    public function members() { 
     return $this->hasMany('App\Member'); 
    } 

} 

Mein Mitglied Modell sieht wie folgt aus:

class Member extends Model 
{ 
    public function scopeActive($query) { 
     return $query->where('membership_ended_at', Null); 
    } 
    public function scopeInactive($query) { 
     return $query->whereNotNull('membership_ended_at'); 
    } 
} 

Dies ist, was ich will in der Lage zu tun:

$association = Association::find(49); 
$association->members->active()->count(); 

Nun, ich bin mir dessen bewusst ein Unterschied zwischen einer Abfrage und einer Sammlung gibt. Aber was ich im Grunde frage ist, ob es einen ähnlichen Umfang für Sammlungen gibt. Die optimale Lösung wäre natürlich, keine ZWEI aktiven Methoden schreiben zu müssen, sondern eine für beide Zwecke zu verwenden.

+3

Hat '$ association-> members() -> active() -> count();' Arbeit? –

+0

Wow. Ich schätze, ich habe mich dadurch täuschen lassen, dass ich '$ association-> members 'machen konnte Danke! – Pistachio

+1

Wenn du nur '$ association-> members 'machst, bekommst du alle assoziierten Mitglieder, nicht nur die aktiven Mitglieder ... Nur damit du es weißt –

Antwort

3

(Frage bereits in den Kommentaren beantwortet, aber minus als auch eine richtige Antwort schreiben)

Es ist nicht möglich, einen Abfragebereich in einem Colletion zu verwenden, da Abfragebereich ein Konzept in Eloquent verwendeten Einschränkungen hinzufügen zu einer Datenbankabfrage während Collections sind nur eine Sammlung von Dingen (Daten, Objekte, etc).

In Ihrem Fall, was Sie tun müssen, um diese Zeile zu ändern:

$association->members->active()->count(); 

zu:

$association->members()->active()->count(); 

Dies funktioniert, weil, wenn wir members als Methode aufrufen, werden wir eine bekommen QueryBuilder Instanz und damit können wir Bereiche an die Abfrage verketten, bevor die Methode count aufgerufen wird.

Verwandte Themen