2015-06-19 14 views
6
modello

mia associazione si presenta così (codice irrilevante redatto):usando una portata di query in un laravel collezione

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

} 

Il mio modello Gli assomiglia a questo:

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'); 
    } 
} 

Questo è quello che voglio essere in grado di fare:

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

Ora, sono a conoscenza che c'è una differenza tra una query e una raccolta. Ma quello che sostanzialmente chiedo è se esiste una sorta di ambito simile per le collezioni. Ovviamente, la soluzione ottimale sarebbe non dover scrivere DUE metodi attivi, ma usarne uno per entrambi gli scopi.

+3

Does '$ association-> members() -> active() -> count();' lavoro? –

+0

Wow. Immagino di essermi ingannato permettendomi di fare '$ associazione-> membri' Grazie! – Pistachio

+1

Se fai solo '$ associazione-> membri' otterrai tutti i membri associati, non solo quelli attivi una volta ... Solo così sai –

risposta

3

(domanda già una risposta nei commenti, ma meno così scrivere una risposta adeguata)

Non è possibile utilizzare un ambito query in un Colletion, dal momento che la portata di query è un concetto utilizzato in Eloquente per aggiungere vincoli a una query di database mentre Collections sono solo una raccolta di cose (dati, oggetti, ecc.).

Nel tuo caso, che cosa dovete fare è di cambiare questa linea:

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

a:

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

Questo funziona perché quando chiamiamo members come metodo, stiamo ottenendo un QueryBuilder, e con questo possiamo iniziare a concatenare gli ambiti alla query prima di chiamare il metodo count.

Problemi correlati