2014-09-26 9 views
5

का उपयोग करने वाली एकाधिक ऑब्जेक्ट्स को विलय करना मैं के साथ एकाधिक ऑब्जेक्ट्स (जैसे रसीदें, रिपोर्ट आदि) मर्ज करने का प्रयास कर रहा हूं।एक ही आईडी

enter image description here

ऊपर दिए गए स्क्रीनशॉट दो तत्वों से पता चलता है, लेकिन क्योंकि यह है तीसरे तत्व याद आ रही है:

$receipts = Receipt::all(); 
$reports = Report::all(); 

$collection = $receipts->merge($reports); 

यह परिणाम है:

इस कोड को मैं प्रयोग किया जाता है वही आईडी (आईडी: "1") पहले के रूप में। जो मैं हासिल करने की कोशिश कर रहा हूं वह उन तीनों को संग्रह के रूप में प्रदर्शित करना है।

संपादित करें:

मैं परिणाम की जरूरत वस्तुओं (संग्रह) हो सकता है क्योंकि मैं भी मेरे विचार में, जहां मैं कक्षा जाँच क्या प्रदर्शित करने के लिए निर्धारित करने के लिए पर कोड का उपयोग करें। साथ ही, मैं संग्रह में ऑब्जेक्ट्स को सॉर्ट करने के लिए इस फ़ंक्शन का उपयोग करता हूं।

$collection->sort(function($a, $b) 
    { 
     $a = $a->created_at; 
     $b = $b->created_at; 
     if ($a === $b) { 
      return 0; 
     } 
     return ($a > $b) ? 1 : -1; 
    }); 
+0

कोई कारण नहीं है कि विलय काम नहीं करना चाहिए। संग्रह वस्तुओं के किसी भी गुण पर निर्भर नहीं है। हुड के तहत 'मर्ज() 'सरणी योग्य वस्तुओं का सिर्फ' array_merge' है।रिपोर्ट ऑब्जेक्ट कैसा दिखता है? – tomvo

उत्तर

0

आप सभी संग्रहों को एक सरणी में डाल सकते हैं और इसका उपयोग कर सकते हैं। इस संग्रह पर निर्भर करता है कि आप संग्रह के साथ क्या करना चाहते हैं।

$list = array(); 
$list = array_merge($list, Receipt::all()->toArray()); 
$list = array_merge($list, Report::all()->toArray()); 
+0

कृपया मेरा संपादन देखें। मैंने यह भी कोशिश की है, लेकिन मुझे परिणामों की ज़रूरत है। – user3811576

4

मुझे पता है कि यह एक पुराने सवाल है, लेकिन मैं अभी भी इस सवाल का जवाब सिर्फ मामले में किसी की तरह मैंने किया खोज से यहां आता है प्रदान करेगा।

यदि आप दो अलग-अलग वाद्य संग्रहों को एक में विलय करने का प्रयास करते हैं और कुछ वस्तुओं में एक ही आईडी होती है, तो कोई दूसरे को ओवरराइट कर देगा। मुझे पता नहीं है कि यह क्यों करता है और यदि यह एक बग या सुविधा है - अधिक शोध की आवश्यकता है। इसे ठीक करने के लिए बस इसके बजाय पुश() विधि का उपयोग करें या इससे बचने के लिए समस्या के प्रति अपने दृष्टिकोण पर पुनर्विचार करें। एक समस्या की

उदाहरण:

$cars = Car::all(); 
$bikes = Bike::all(); 
$vehicles = $cars->merge($bikes); 
// if there is a car and a bike with the same id, one will overwrite the other 

सम्भावित समाधान:

$collection = collect(); 
$cars = Car::all(); 
$bikes = Bike::all(); 

foreach ($cars as $car) 
    $collection->push($car); 

foreach ($bikes as $bike) 
    $collection->push($bike); 

स्रोत: https://medium.com/@tadaspaplauskas/quick-tip-laravel-eloquent-collections-merge-gotcha-moment-e2a56fc95889

2

मैं जानता हूँ कि मैं एक 4 साल की धागा जोड़ने से कर रहा हूँ, लेकिन मैं इस में आए और कोई भी उत्तर वह नहीं था जिसे मैं ढूंढ रहा था; तो, जैसे @ टाडास, मैं उन लोगों के लिए अपना उत्तर छोड़ दूंगा जो इस पर आएंगे। लार्वेल 5.5 दस्तावेज को देखने के बाद मैंने पाया कि concat जाने-जाने की विधि थी। तो, ओपी के मामले में सही समाधान होगा:

$receipts = Receipt::all(); 
$reports = Report::all(); 

$collection = $receipts->concat($reports); 

इस तरह रिपोर्ट संग्रह में हर तत्व प्राप्तियां संग्रह में हर तत्व से जोड़ दिए जाएंगे, घटना अगर कुछ क्षेत्रों के समान हैं।

आखिरकार आप इसे अधिक दृश्य आकर्षक परिणाम प्राप्त करने के लिए इसे घुमा सकते हैं उदा। एक दृश्य:

$collection->shuffle(); 
संबंधित मुद्दे