2014-04-08 12 views
7

Dire che ho un modello Box che contiene molti widget. I widget possono essere attivi o inattivi (booleano). Il modello Widget ha una portata di query in grado di filtrare i risultati:Eager caricamento del modello correlato utilizzando lo scope di query

modelli/box.php:

class Box extends Eloquent 
{ 
    public function widgets() 
    { 
     return $this->hasMany('Widget'); 
    } 
} 

modelli/widget.php:

class Widget extends Eloquent { 

    public function box() 
    { 
     return $this->belongsTo('Box'); 
    } 

    public function scopeActive($query) 
    { 
     return $query->whereActive(true); 
    } 
} 

ambiti di query lo rendono facile da ottenere tutti widget per un dato scatola:

$box_widgets = Box::find($box_id)->widgets()->active()->get(); 
// returns an Eloquent\Collection containing a filtered array of widgets 

ma come posso usare per scopeActive eliminare questa ansiosa caricamento della funzione condizionale del metodo with?

$boxes = Box::with(array('widgets', function ($q) 
{ 
    $q->active(); 
}))->get(); 

Sembra che probabilmente c'è una scorciatoia per l'accesso a portata di un rapporto, qualcosa come Box::with('widgets->active') o Box::with('widgets.active'), ma non sono stati in grado di trovarlo.

risposta

13

Supponiamo che la maggior parte del tempo che si desidera solo i widget attivi, quindi suggerisco:

public function widgets() 
{ 
    return $this->hasMany('Widget')->whereActive(true); 
} 

public function widgetsDisabled() 
{ 
    return $this->hasMany('Widget')->whereActive(false); 
} 

È possibile impostare su più, ad esempio per il carico tutto in una volta, come hai ora.

carico Poi ansioso facilmente come che:

Box::with('widgets')... // loads only active 
+0

Praticamente esattamente quello che stavo cercando, grazie! Giusto per chiarire, questi sono metodi del modello Box. Questo fornisce anche i set con nomi diversi, il che è fantastico. – joemaller

+0

Sì, certo che appartengono al modello Box. Avere nomi diversi per le relazioni come te è davvero grandioso, perché puoi rendere il codice dettagliato e facile da usare –

Problemi correlati