2014-06-13 11 views
17

मैं सबसे लोकप्रिय हैकथॉन प्राप्त करने की कोशिश कर रहा हूं जिसके लिए संबंधित हैकथॉन के partipants->count() द्वारा आदेश की आवश्यकता है। क्षमा करें अगर यह समझने में थोड़ा मुश्किल है।लैरवेल ऑर्डरबी रिश्ते की गिनती

hackathons 
    id 
    name 
    ... 

hackathon_user 
    hackathon_id 
    user_id 

users 
    id 
    name 

Hackathon मॉडल है:

class HackathonParticipant extends \Eloquent { 

    protected $fillable = ['hackathon_id', 'user_id']; 

    protected $table = 'hackathon_user'; 

    public function user() 
    { 
     return $this->belongsTo('User', 'user_id'); 
    } 

    public function hackathon() 
    { 
     return $this->belongsTo('Hackathon', 'hackathon_id'); 
    } 
} 

मैं Hackathon::orderBy(HackathonParticipant::find($this->id)->count(), 'DESC')->take(5)->get()); की कोशिश की है:

class Hackathon extends \Eloquent { 
    protected $fillable = ['name', 'begins', 'ends', 'description']; 

    protected $table = 'hackathons'; 

    public function owner() 
    { 
     return $this->belongsToMany('User', 'hackathon_owner'); 
    } 

    public function participants() 
    { 
     return $this->belongsToMany('User'); 
    } 

    public function type() 
    { 
     return $this->belongsToMany('Type'); 
    } 
} 

और HackathonParticipant के रूप में परिभाषित किया गया है

मैं निम्न स्वरूप के साथ एक डेटाबेस है लेकिन मुझे लगता है कि मैंने एक बड़ी गलती की है (संभवतः $ यह-> आईडी), क्योंकि यह बिल्कुल काम नहीं करता है।

मैं सबसे लोकप्रिय हैकथॉन प्राप्त करने की कोशिश करने के बारे में कैसे जाउंगा जो संबंधित हैकथॉन पार्टेंटेंट्स की उच्चतम संख्या पर आधारित है?

उत्तर

21

आप इसे आसानी से करने के लिए Collection के sortBy() और count() विधियों का उपयोग करने में सक्षम होना चाहिए।

$hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon) 
{ 
    return $hackathon->participants->count(); 
}); 
+0

कैसे asending/desecnding बदलने के लिए? – FooBar

+2

'sortBy (क्लोजर $ कॉलबैक, $ विकल्प = SORT_REGULAR, बूल $ अवरोही = झूठा)' बस सही पर तीसरा पैरामीटर सेट करें। – user3158900

+19

क्रमशः डीबी स्तर पर ऐसा नहीं करता है ... तो यह पेजिंग के साथ सही काम नहीं करेगा! अच्छा जब आप एक पूर्ण सेट लौट रहे हैं तो अच्छा .. –

12

मैं इसी तरह की समस्या है, sortBy का उपयोग कर() पृष्ठांकन की वजह से उपयुक्त नहीं है, बिल्कुल के रूप में सबरीना Gelbart पिछले समाधान में टिप्पणी की थी। तो मैं db कच्चे, यहाँ सरलीकृत है क्वेरी प्रयोग किया है:

Tag::select( 
array(
    '*', 
    DB::raw('(SELECT count(*) FROM link_tag WHERE tag_id = id) as count_links')) 
)->with('links')->orderBy('count_links','desc')->paginate(5); 
+1

सबसे अच्छा समाधान मैंने लार्वेल के पुराने संस्करणों के लिए पाया है! (नए लोग काउंटर के साथ उपयोग कर सकते हैं) सुनिश्चित नहीं है कि यह क्या था लेकिन मैंने 'tag_id = id' के बजाय 'tag_id = tag.id'' किया था ... आप इसे और भी सरल बना सकते हैं! 'चयन' करने के बजाय आप केवल 'ऑर्डरब्रा (') लिंक_टैग से TAG_id = tag.id से चयन गिनती (*) कर सकते हैं, क्योंकि count_links ') DESC') -> पेजिनेट (5) '।और उन लोगों के लिए, आपको '-> के साथ' की आवश्यकता नहीं है जब तक आप रिश्ते –

+0

और रिश्ते को लोड नहीं कर रहे हैं ... और यदि आप चाहें तो आप इसे एक दायरे में भी कर सकते हैं ... 'टैग :: orderByLinkCount() - > पेजिनेट (5) 'फिर अपने टैग मॉडल में अपने ऑर्डर के साथ' स्कोप ऑर्डर ByLinkCount' बनाएं ByRaw स्टेटमेंट –

+0

मुझे लगता है कि यह 'टैग_आईडी = टैग.आईडी' नहीं होना चाहिए, जहां टैग_आईडी = आईडी' –

0

तुम भी ऑपरेटर में शामिल होने का उपयोग कर सकते हैं। जैसा कि सबरीना ने कहा था, आप डीबी स्तर पर सॉर्टबी का उपयोग नहीं कर सकते हैं।

$hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id') 
      ->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`') 
      ->groupBy('hackathon.id') 
      ->orderBy('count','DESC') 
      ->paginate(5); 

लेकिन यह कोड डेटाबेस से सभी रिकॉर्ड लेता है। तो आपको मैन्युअल रूप से पेजिंग करना चाहिए।

 $hackathons = Hackathon::leftJoin('hackathon_user','hackathon.id','=','hackathon_user.hackathon_id') 
      ->selectRaw('hackathon.*, count(hackathon_user.hackathon_id) AS `count`') 
      ->groupBy('hackathon.id') 
      ->orderBy('count','DESC') 
      ->skip(0)->take(5)->get(); 

से भेजा: https://stackoverflow.com/a/26384024/2186887

36

यह Laravel 5.3 में मेरे लिए काम करता है, अपने उदाहरण का उपयोग:

Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10); 

इस तरह यह क्वेरी और पृष्ठांकन पर आदेश दिया है अच्छी तरह से काम करता है।

+0

स्वीकार्य से यह एक बेहतर जवाब है एक। – tremby

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