2014-04-08 5 views
7

कहें कि मेरे पास एक मॉडल Box है जिसमें कई विजेट हैं। विजेट सक्रिय या निष्क्रिय (बूलियन) हो सकते हैं।क्वेरी स्कोप का उपयोग कर उत्सुक लोडिंग संबंधित मॉडल

मॉडल/box.php:

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

मॉडल/widget.php:

class Widget extends Eloquent { 

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

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

क्वेरी स्कोप यह आसान सभी प्राप्त करने के लिए बनाने के Widget मॉडल एक प्रश्न गुंजाइश परिणाम फ़िल्टर कर सकते जो है

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

लेकिन यह कैसे मैं करने के लिए scopeActive उपयोग कर सकते हैं: किसी दिए गए बॉक्स के लिए विगेट्स इस उत्सुक लोडिंग को with विधि के सशर्त कार्य को खत्म करें?

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

ऐसा लगता है वहाँ शायद Box::with('widgets->active') या Box::with('widgets.active') की तरह एक संबंध की गुंजाइश है, कुछ तक पहुँचने के लिए एक आशुलिपि है, लेकिन मैं इसे खोजने के लिए नहीं कर पाए हैं की तरह।

उत्तर

13

मान लीजिए ज्यादातर समय आप केवल सक्रिय विजेट चाहते हैं, इसलिए मेरा सुझाव है:

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

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

आप की तरह आप अभी उपयोग कर अधिक, लोड करने के लिए उदाहरण के लिए सभी को एक बार ऊपर सेटअप कर सकते हैं,।

फिर उत्सुक लोड के रूप में आसानी के रूप में:

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

सुंदर ज्यादा मैं वास्तव में क्या देख रहा था, धन्यवाद! बस स्पष्ट करने के लिए, ये बॉक्स मॉडल के तरीके हैं। यह विभिन्न नामों के साथ सेट भी प्रदान करता है, जो कि बहुत अच्छा है। – joemaller

+0

हां, बेशक वे बॉक्स मॉडल से संबंधित हैं। आपके जैसे संबंधों के लिए विभिन्न नामों को छिपाना वास्तव में बहुत अच्छा है क्योंकि आप कोड वर्बोज़ और उपयोग में आसान बना सकते हैं –

संबंधित मुद्दे