2015-09-04 18 views
8

में एकाधिक संग्रहों को सही तरीके से मर्ज कैसे करें मैं एकाधिक संग्रहों को एक में विलय करना चाहता हूं। मैं एक समाधान है, जो पीछा कर रहा है की क्या ज़रूरत है:लार्वेल

$allItems = $collection1->merge($collection2) 
         ->merge($collection3) 
         ->merge($collection4) 
         ->merge($collection5); 

यह वास्तव में कार्य करता है, लेकिन मैं ऐसे मामलों में जहां कुछ या संग्रह में से सभी में कोई वस्तुओं को शामिल में समस्याएं आ। मुझे call to merge() on non object की लाइनों के साथ एक त्रुटि मिलती है।

मैंने वास्तव में सभी संग्रहों की एक सरणी बनाने की कोशिश की, और फिर उनकी वैधता की जांच करते समय उनके माध्यम से फिर से प्रयास किया, लेकिन यह काम नहीं किया और मुझे लगता है कि यह बहुत ही सुरुचिपूर्ण नहीं था।

कुछ संग्रहों को विलय करने की इस प्रक्रिया के माध्यम से मैं सुंदर ढंग से पुन: प्रयास कैसे कर सकता हूं, जबकि कुछ या सभी संग्रह खाली या अमान्य हो सकते हैं? की सराहना की!

उत्तर

11

जो मैंने समाप्त किया वह प्रत्येक चरण को अलग कर रहा था। यह मर्ज चेनिंग था जो इसे मार रहा था, क्योंकि कुछ या सभी संग्रह अमान्य हो सकते थे।

$allItems = new \Illuminate\Database\Eloquent\Collection; //Create empty collection which we know has the merge() method 
$allItems = $allItems->merge($collection1); 
$allItems = $allItems->merge($collection2); 
$allItems = $allItems->merge($collection3); 
$allItems = $allItems->merge($collection4); 
+1

यह अजीब बात है कि आप इन्हें श्रृंखला नहीं दे सकते हैं, लेकिन मैं पुष्टि कर सकता हूं कि यह सही है। – mopo922

+2

इसे देखने वाले लोगों के लिए बस एक अपडेट आप एक नया संग्रह बनाने के लिए '$ allItems = collect();' कर सकते हैं। –

0

, अपने डेटा पर निर्भर करता है, तो संग्रह वास्तव में रिक्त है या अपने php समर्थन यह आप कर सकते हैं:

$allItems = $collection1->merge($collection2 ?: collect()) 
        ->merge($collection3 ?: collect()) 
        ->merge($collection4 ?: collect()) 
        ->merge($collection5 ?: collect()); 

या आप एक को कम करना चाहते हैं:

$allItems = collect([$collection2, $collection3, $collection4])->reduce(function($arr, $item) { 
     if (empty($item) || $item->isEmpty()) 
      return $arr; 
     return $arr->merge($item); 
    }, $collection1); 

या सादे php के बिना कम करने ओवरहेड

$allItems = array_reduce([ 
     $collection2, 
     $collection3, 
     $collection4 
    ], function($arr, $item) { 
     if (empty($item) || $item->isEmpty()) 
      return $arr; 
     return $arr->merge($item); 
    }, $collection1); 
+0

दुर्भाग्य से ये खाते में तथ्य यह है कुछ या संग्रह के सभी अमान्य हो सकता है कि नहीं लेते, incluing $ संग्रह 1 – Marcel

1

मैं एक ही सवाल था, इसलिए मैं निम्नलिखित तरीके से इसे हल:

$clients = ClientAccount::query()->get(); 
$admins = AdminAccount::query()->get(); 

$users = collect($clients)->merge($admins)->merge($anotherCollection)->merge(...);