मेरी जानकारी के अनुसार, उत्सुक भार 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();