मेरी जानकारी के अनुसार, उत्सुक भार with विधि दूसरी क्वेरी चलाएं। इसलिए उत्सुक लोडिंग . के साथ आप वह हासिल नहीं कर सकते जो आप चाहते हैं with विधि।
मुझे लगता है कि join . का उपयोग करें संबंध विधि . के संयोजन में विधि समाधान है। निम्नलिखित समाधान पूरी तरह से परीक्षण किया गया है और अच्छी तरह से काम करता है।
// In User Model
public function channels()
{
return $this->belongsToMany('App\Channel', 'channel_user')
->withPivot('is_approved');
}
public function sortedChannels($orderBy)
{
return $this->channels()
->join('replies', 'replies.channel_id', '=', 'channel.id')
->orderBy('replies.created_at', $orderBy)
->get();
}
फिर आप $user->sortedChannels('desc') . पर कॉल कर सकते हैं चैनलों . की सूची प्राप्त करने के लिए जवाबों द्वारा आदेश created_at विशेषता।
चैनलों . जैसी स्थिति के लिए (जिसके उत्तर हो भी सकते हैं और नहीं भी), बस leftJoin . का उपयोग करें विधि।
public function sortedChannels($orderBy)
{
return $this->channels()
->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
->orderBy('replies.created_at', $orderBy)
->get();
}
संपादित करें:
अगर आप groupBy जोड़ना चाहते हैं क्वेरी के लिए विधि, आपको अपने orderBy . पर विशेष ध्यान देना होगा खंड। क्योंकि एसक्यूएल . में प्रकृति, Group By Order By . से पहले क्लॉज रन करें खंड। इस समस्या को विस्तार से देखें यह स्टैक ओवरफ्लो प्रश्न
।
इसलिए यदि आप groupBy जोड़ते हैं विधि, आपको उपयोग करना होगा orderByRaw विधि और निम्नलिखित की तरह लागू किया जाना चाहिए।
return $this->channels()
->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
->groupBy(['channels.id'])
->orderByRaw('max(replies.created_at) desc')
->get();