2014-09-22 11 views
5

में पिवट तालिका से गिनती प्राप्त करना मेरे पास ऑर्डर और उत्पादों के लिए कई रिश्ते हैं।लार्वेल eloquent

<?php 
class Order extends Eloquent { 

    public function user() 
    { 
     return $this->belongsTo('User'); 
    } 

    public function products() 
    { 
     return $this->belongsToMany('Product'); 
    } 
} 
?> 


<?php 
class Product extends Eloquent { 

    public function orders() 
    { 
     return $this->belongsToMany('Order'); 
    } 

} 
?> 

बार प्रत्येक उत्पाद है ordered.In mysql, इस कार्य

SELECT products.id, products.description, count(products.id) 
FROM products 
INNER JOIN order_product ON products.id = order_product.product_id 
INNER JOIN orders ON orders.id = order_product.order_id 
GROUP BY product_id 
LIMIT 0 , 30 

ऊपर क्वेरी के परिणाम निम्न क्वेरी का उपयोग करके प्राप्त किया जा सकता है की संख्या लाने के लिए की आवश्यकता है इस प्रकार है: -

id description count(products.id)  
1  Shoes   3 
2  Bag   2 
3  Sun glasses 2 
4  Shirt   2 

लार्वेल eloquent (क्वेरी बिल्डर का उपयोग किए बिना) का उपयोग करके यह कार्य कैसे प्राप्त किया जा सकता है ???? मैं लार्वेल eloquent का उपयोग कर प्रत्येक उत्पाद का आदेश कैसे दिया जा सकता है ??

उत्तर

20

माइंड Eloquent हुड के नीचे Query\Builder का उपयोग करता है, इसलिए लैरवेल में ऐसी कोई चीज़ नहीं है, जैसे 'प्रश्न निर्माता का उपयोग किए बिना पूछताछ'।

और यह तुम क्या जरूरत है:

// additional helper relation for the count 
public function ordersCount() 
{ 
    return $this->belongsToMany('Order') 
     ->selectRaw('count(orders.id) as aggregate') 
     ->groupBy('pivot_product_id'); 
} 

// accessor for easier fetching the count 
public function getOrdersCountAttribute() 
{ 
    if (! array_key_exists('ordersCount', $this->relations)) $this->load('ordersCount'); 

    $related = $this->getRelation('ordersCount')->first(); 

    return ($related) ? $related->aggregate : 0; 
} 

यह आपको उत्सुक लोड हो रहा है का लाभ लेने दूँगी:

$products = Product::with('ordersCount')->get(); 

// then for each product you can call it like this 
$products->first()->ordersCount; // thanks to the accessor 

Eloquent accessors & mutators बारे में अधिक पढ़ें,

और के बारे में dynamic properties, जिनमें से उपरोक्त एक्सेसर नकल व्यवहार।


बेशक आप सरल इस्तेमाल कर सकते हैं के

आप उदाहरण की तरह बिल्कुल एक ही क्वेरी पाने के लिए मिलती है।

+0

कोड ठीक काम कर रहा है और मुझे वांछित परिणाम मिल रहा है। आपकी मदद के लिए धन्यवाद :) :) लेकिन एक और सवाल। फंक्शन प्राप्त करें ऑर्डर काउंटर एट्रिब्यूट() ऑर्डर का उपयोग करते समय स्वचालित रूप से कॉल किया जाता है() ???? क्या आप समझा सकते हैं ये दो कार्य प्रवाह में कैसे जाते हैं ??? – developer34

+0

संपादन संपादित करें - दस्तावेज़ों के लिए जोड़े गए लिंक, जहां आपको अपनी आवश्यकता हो सकती है। असल में एक्सेसर्स/म्यूटेटर जादू '__get'/'__set' का लाभ उठाते हैं और आपको मॉडल के गुणों में हेरफेर करने देते हैं ताकि वे आपकी ज़रूरतों को पूरा कर सकें। create_at और अन्य टाइमस्टैम्प बहुत समान तरीके से काम करते हैं। –

+0

मैं पूरी तरह से एक्सेसर्स/mutators के बारे में भूल गया। संदर्भ के लिए धन्यवाद !!! :) :) – developer34

0

मैं Laravel 5.1 उपयोग कर रहा हूँ और मैं पूरा करने के लिए है कि इस

$photo->posts->count() 

करके सक्षम हूँ और फोटो मॉडल में पदों विधि लग रहा है इस

public function posts(){ 
    return $this->belongsToMany('App\Models\Posts\Post', 'post_photos'); 
} 
3

की तरह आप पहले से ही $ उत्पादों है ऑब्जेक्ट, आप निम्न कार्य कर सकते हैं:

$rolecount = $products->roles()->count(); 

या यदि आप उत्सुक लोडिंग का उपयोग कर रहे हैं:

$rolecount = $products->roles->count(); 

चीयर्स।

11

भविष्य के दर्शकों के लिए, लैरवेल 5 के रूप में।2, वहाँ उन्हें लोड के बिना रिश्तों की गिनती, अपने संसाधन मॉडल या accessors से जुड़े बिना के लिए देशी कार्यक्षमता है -

अनुमोदित जवाब में उदाहरण के संदर्भ में, आप अपने नियंत्रक में जगह होगा:

$products = Product::withCount('orders')->get(); 

अब, जब आप अपने दृश्य पर $ उत्पादों के माध्यम से पुनरावृति, वहाँ एक orders_count है (या, सामान्य रूप से, बस एक {resource}_count) प्रत्येक को पुनः प्राप्त उत्पाद रिकॉर्ड है, जो आप बस के रूप में आप किसी भी अन्य स्तंभ मान प्रदर्शित कर सकते हैं पर स्तंभ:

@foreach($products as $product) 
    {{ $product->orders_count }} 
@endforeach 

यह विधि एक ही परिणाम के लिए अनुमोदित विधि की तुलना में 2 कम डेटाबेस क्वेरीज उत्पन्न करती है, और एकमात्र मॉडल भागीदारी यह सुनिश्चित कर रही है कि आपके रिश्तों को सही तरीके से स्थापित किया गया हो। यदि आप इस बिंदु पर L5.2 + का उपयोग कर रहे हैं, तो मैं इसके बजाय इस समाधान का उपयोग करूंगा।

+0

यह उत्कृष्ट है - हर किसी को इसका उपयोग करना चाहिए ... –

+0

यदि मैं कर सकता तो मैं आपको +10 देता। यह जवाब स्वीकार किया जाना चाहिए। – ElChupacabra

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