संबंध के कॉलम के लारवेल एलोकेंट योग


111

मैं एक शॉपिंगकार्ट एप्लिकेशन पर काम कर रहा हूं और अब मैं निम्नलिखित मुद्दे पर आया हूं।

एक उपयोगकर्ता, एक उत्पाद और एक कार्ट ऑब्जेक्ट है।
- कार्ट टेबल में केवल निम्नलिखित कॉलम होते हैं: "id", "user_id", "product_id" और टाइमस्टैम्प।
- UserModel "hasMany" कार्ट (क्योंकि एक उपयोगकर्ता कई उत्पादों को स्टोर कर सकता है)।
- CartModel "अंतर्गत आता है" एक उपयोगकर्ता और CartModel "hasMany" उत्पाद।

अब कुल उत्पादों की गणना करने के लिए मैं सिर्फ कॉल कर सकता हूं Auth::user()->cart()->count():।

मेरा प्रश्न है: मैं इस उपयोगकर्ता द्वारा कार्ट में उत्पादों के मूल्य (उत्पाद का एक कॉलम) कैसे प्राप्त कर सकता हूं?
मैं एलोकेंट के साथ इसे पूरा करना चाहता हूं और क्वेरी का उपयोग करके नहीं (मुख्यतः क्योंकि मेरा मानना ​​है कि यह बहुत क्लीनर है)।

जवाबों:


220
Auth::user()->products->sum('price');

प्रलेखन कुछ Collectionविधियों के लिए एक छोटा सा प्रकाश है, लेकिन सभी क्वेरी बिल्डर समुच्चय इसके अलावा उपलब्ध हैं इसके अलावा http://laravel.com/docs/queries#aggregatesavg() पर पाया जा सकता है ।


वाह उस त्वरित उत्तर के लिए धन्यवाद। अब यह कहता है कि कोई मूल्य स्तंभ नहीं है। ऐसा लग रहा है कि
सुस्वादु

3
वास्तव में यह समझ में आता है, आपको उत्पादों की तालिका को रिश्ते में जोड़ना होगा, क्षमा करें। कोशिश करें $sum = Auth::user()->cart()->products()->sum('price');या जो भी कीमत स्तंभ आपके उत्पादों की मेज पर है।
user1669496

1
यह मेरे लिए काम किया! मैंने कार्टक्लासेस का उपयोग करना बंद कर दिया। उपयोगकर्ता और उत्पाद दोनों के पास अब एकTTMMany () विधि है। अब मैं मूल्य का उपयोग करने में सक्षम हूं: {{प्रामाणिक :: उपयोगकर्ता () -> उत्पादों-> राशि ('मूल्य')}} थैंक्स, यह मामला हल हो गया है।
theAdmiral

9
यहाँ कुछ काफी सही नहीं है - आपका लिंक डेटाबेस के प्रश्नों के लिए कुल कार्यों को लागू करने को संदर्भित करता है, लेकिन products->sumइसका मतलब यह है कि यह एक संग्रह ऑब्जेक्ट पर कॉल योग है, बजाय उत्पादों द्वारा लौटाए गए बिल्डर ऑब्जेक्ट पर ()। यह स्पष्ट करने के लायक है कि आप यहां किसका मतलब है, और आदर्श रूप से दोनों को समझाने के लिए एक लिंक प्रदान करते हैं।
बेनुबर्ड

1
@ user3253002 कोष्ठक के बिना एक रिश्ते का उपयोग कर ...->products->...मौजूदा मॉडल के सभी संबंधित उत्पादों को प्राप्त करने के लिए डेटाबेस को क्वेरी करेगा और फिर उस मेमोरी मेमोरी में काम करेगा। ...->products()->...जब तक कुछ कहा जाता है, तब तक इसे निष्पादित किए बिना बनाए जा रहे क्वेरी को संशोधित करने का उपयोग करना । ->sum()बाद वाला अधिक कुशल हो सकता है, क्योंकि यह डेटाबेस से अनावश्यक जानकारी को मेमोरी में स्थानांतरित करने से बचता है।
सेजेन

62

यह आपका उत्तर नहीं है, लेकिन उन लोगों के लिए है जो किसी अन्य समस्या का समाधान खोज रहे हैं। मैं सशर्त रूप से संबंधित तालिका के एक कॉलम का योग प्राप्त करना चाहता था। मेरे डेटाबेस में डील्स में कई एक्टिविटीज हैं, जिन्हें मैं एक्टिविटी टेबल से "अमाउंट_टोटल" की राशि प्राप्त करना चाहता था, जहां गतिविधियां। ईडल_आईडी = डील.आईडी और एक्टिविटी.स्टैटस = भुगतान किया गया था, इसलिए मैंने ऐसा किया।

$query->withCount([
'activity AS paid_sum' => function ($query) {
            $query->select(DB::raw("SUM(amount_total) as paidsum"))->where('status', 'paid');
        }
    ]);

यह लौट आता है

"paid_sum_count" => "320.00"

सौदों की विशेषता में।

यह अब वह राशि है जिसे मैं गिनना नहीं चाहता था।


4
यह कई मामलों में सबसे अच्छा है क्योंकि आप सभी रिकॉर्ड प्राप्त किए बिना इसके द्वारा क्रमबद्ध कर सकते हैं।
सबरीना लेगट

15

मैंने कुछ ऐसा ही करने की कोशिश की, जिससे मुझे एकत्रित () फ़ंक्शन का पता लगाने में बहुत समय लग गया। तो आप इस तरह से कुछ कर सकते हैं:

collect($items)->sum('amount');

इससे आपको सभी वस्तुओं का कुल योग मिलेगा।


4
समारोह का नाम वास्तव में हैcollect()
लियोनार्डो बील

आप शायद बेहतर सिर्फ सरणी पाशन से दूर हैं। collect()किसी संग्रह ऑब्जेक्ट में किसी सरणी को समृद्ध करने के लिए उपयोग किया जाता है, लेकिन अगर आपके पास पहले संग्रह में संग्रह नहीं है, तो कच्चे सरणी का उपयोग करना बेहतर हो सकता है
Flame

0

इसके अलावा क्वेरी बिल्डर का उपयोग करना

DB::table("rates")->get()->sum("rate_value")

तालिका दरों के अंदर सभी दर मूल्य का सारांश प्राप्त करने के लिए।

उपयोगकर्ता उत्पादों का सारांश प्राप्त करने के लिए।

DB::table("users")->get()->sum("products")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.