2014-04-15 23 views
14

मैं दो संग्रह है और मैं (एक collumn द्वारा, बेशक आदेश के साथ - created_at) एक चर करने के लिए यह विलय चाहते हैं। मैं उसे कैसे कर सकता हूँ?मर्ज करें और दो वाद्य संग्रहों को क्रमबद्ध करें?

मेरे नियंत्रकों दिखता है:

जवाब:

ID | ticket_id | username | message | created_at 
1 | 1   | somebody | asdfghj | 2014-04-12 12:12:12 
2 | 1   | somebody | qwertyi | 2014-04-14 12:11:10 

लॉग्स:

ID | ticket_id | username | action | created_at 
1 | 1   | somebody | close | 2014-04-13 12:12:14 
2 | 1   | somebody | open | 2014-04-14 14:15:10 

और मैं कुछ इस तरह चाहते

$replies = Ticket::with('replies', 'replies.user')->find($id); 
$logs = DB::table('logs_ticket') 
     ->join('users', 'users.id', '=', 'mod_id') 
     ->where('ticket_id', '=', $id) 
     ->select('users.username', 'logs_ticket.created_at', 'action') 
     ->get(); 

मेरे आउटपुट उदाहरण के लिए लग रहा है :

ticket_id | table | username | message | created_at 
1   |replies| somebody | asdfghj | 2014-04-12 12:12:12 
1   | logs | somebody | close | 2014-04-13 12:12:14 
1   | logs | somebody | open | 2014-04-14 11:15:10 
1   |replies| somebody | qwertyi | 2014-04-14 12:11:10 

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

मेरे टिकट मॉडल दिखता है:

<?php 

class Ticket extends Eloquent { 

    protected $table = 'tickets'; 

    public function replies() { 
     return $this->hasMany('TicketReply')->orderBy('ticketreplies.created_at', 'desc'); 
    } 

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

डीबी :: तालिका रिटर्न सरणी इस प्रकार के परिणाम असंगत हो जाएगा या सुवक्ता संग्रह/मॉडल के लिए रूपांतरण की आवश्यकता होगी। –

+0

@deczo I ने टिकट मॉडल को बेहतर तरीके से अपना उत्तर प्राप्त करने के लिए अपने मॉडल को रिश्तों के साथ चिपकाएं। – Siper

+0

लॉग के बारे में क्या? –

उत्तर

19

आप वास्तव में क्या आप आसानी से चाहते प्राप्त करने में सक्षम होने के लिए नहीं जा रहे हैं।

सामान्य रूप से, विलय $collection->merge($otherCollection); के साथ आसान होना चाहिए, और $collection->sort(); के साथ सॉर्ट करना चाहिए। हालांकि, विलय उस तरीके से काम नहीं करेगा जो आप चाहते हैं कि अद्वितीय आईडी न हो और 'टेबल' कॉलम जो आप चाहते हैं, आपको मैन्युअल रूप से करना होगा।

इसके अलावा वे वास्तव में दोनों अलग-अलग प्रकार का संग्रह होने की मुझे लगता है कि जा रहे हैं (एक एक Eloquent\Model के आधार पर किया जा रहा Eloquent\Collection हो जाएगा, और अन्य एक मानक Collection जा रहा है), अपने स्वयं के समस्याओं का कारण बन सकता है। इस प्रकार, मैं दोनों के लिए डीबी :: टेबल() का उपयोग करने और आपके परिणामों को उन कॉलम के साथ बढ़ाने का सुझाव दूंगा जिन्हें आप नियंत्रित कर सकते हैं।

कोड है कि प्राप्त करने के लिए के रूप में, मैं के रूप में मैं Laravel में निम्न स्तर के डीबी बहुत काम नहीं करते यकीन नहीं है, इसलिए प्रश्नों बनाने के लिए सबसे अच्छा तरीका है पता नहीं है। किसी भी तरह से, सिर्फ इसलिए कि यह दो प्रश्नों और कुछ PHP विलय के साथ इसे प्रबंधित करने के लिए दर्द होना शुरू कर रहा है, मैं सुझाव देता हूं कि यह सब एक डीबी क्वेरी में कर रहा है। यह वास्तव में neater देखो करेंगे और यकीनन अधिक maintainable हो:

एसक्यूएल आप की आवश्यकता होगी कुछ इस तरह है:

SELECT * FROM 
(
    SELECT 
     `r`.`ticket_id`, 
     'replies' AS `table`, 
     `u`.`username`, 
     `r`.`message`, 
     `r`.`created_at` 
    FROM `replies` AS `r` 
    LEFT JOIN `users` AS `u` 
     ON `r`.`user_id` = `u`.`id` 
    WHERE `r`.`ticket_id` = ? 
) UNION (
    SELECT 
     `l`.`ticket_id`, 
     'logs' AS `table`, 
     `u`.`username`, 
     `l`.`action` AS `message`, 
     `l`.`created_at` 
    FROM `logs` AS `l` 
    LEFT JOIN `users` AS `u` 
     ON `l`.`user_id` = `u`.`id` 
    WHERE `l`.ticket_id` = ? 
) 
ORDER BY `created_at` DESC 

यह बहुत आत्म व्याख्यात्मक है: कर दो प्रश्नों, वही कॉलम लौटने, UNION उन्हें और उसके बाद उस परिणाम को MySQL में सेट करें। उम्मीद है कि यह (या कुछ ऐसा ही है, जैसा कि मुझे आपकी डेटाबेस संरचना का अनुमान लगाना पड़ा) आपके लिए काम करेगा।

अनुवाद है कि एक Laravel DB:: शैली क्वेरी में के रूप में, मुझे लगता है कि है कि आप पर निर्भर है।

18

आपकी समस्या के लिए एक छोटी सी वैकल्पिक हल।

$posts = collect(Post::onlyTrashed()->get()); 
$comments = collect(Comment::onlyTrashed()->get()); 

$trash = $posts->merge($comments)->sortByDesc('deleted_at'); 

इस तरह आप डुप्लिकेट आईडी के दौरान भी उन्हें विलय कर सकते हैं। stdObjects की

+2

अक्षम, लेकिन एक चुटकी में नौकरी करता है! – alexw

+0

यह क्यों काम करता है? सभी संग्रह() विधि एक नया संग्रह बना रहा है? – Robert

+3

एलोक्वेंट एक 'वाद्य संग्रह' देता है और एक सामान्य 'संग्रह' देता है। एक 'सामान्य' संग्रह में 'विध्वंस संग्रह' के बाद विभिन्न विधियां होती हैं। –

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