您好,登錄后才能下訂單哦!
這篇文章主要介紹了Laravel如何根據關聯模型條目數量排序,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在laravel中我們使用模型操作數據庫表,同時使用 hasOne belongTo hasMany 等關聯關系模型 建立不同模型之間的關聯。對于簡單的查詢操作這完全應付的來。
可是現實的業務需求往往充滿變數,今天我們就說一個需求, 根據關聯模型的數量進行排序,應該如何寫代碼。
學習時間
我們用實例進行解釋,首先是表結構,為了簡化操作,只羅列出主要的字段。首先是 hackathons 表的兩個字段:
id
name
begins
ends
description
然后是 user 表的字段:
id
name
還有一個關聯表 hackathon_user 字段:
hackathons_id
user_id
好了,基礎數據已經建立,接著我們使用laravel的模型操作數據庫表。首先聲明 Hackathons 模型:
class Hackathon extends Model { 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'); } }
其中有一個 Type 模型因為與本文所討論問題無關,因此不予列出。接著定義關聯表的模型:
class HackathonParticipant extends Model { 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'); } }
這就是我們需要的基礎類,接著說如何排序。如果不考慮性能問題,或者篩選出的數據量還不足以讓我們考慮到性能問題, 那么可以先把結果數據集整個返回,然后使用 laravel collection 集合進行排序和操作。代碼寫起來像下面這樣:
$hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon) { return $hackathon->participants->count(); });
注意在使用 get 獲取所有的結果數據集之后,調用的是Collection類的 sortBy 方式,默認是升序排列。這個方法在數據量小的時候,沒什么問題。
如果你的數據量很大,動輒幾十萬條,那么上面的 get 方法,萬萬是不能用的,這會大大地增加MySQL與服務器之間的數據傳輸壓力。所以,我們需要在MySQL層面,盡量解決這個問題。
聚合查詢也是關系型數據庫的強項,所以我們需要的是把聚合查詢用laravel實現出來。
laravel 5.3 及以上,我們可以使用 withCount 進行關聯類的聚合查詢了,代碼只需一行:
Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10);
注意laravel自動生成的統計類的字段名不能寫錯。
還有一種方法,就是不使用關聯模型,而該用表連接,繞過模型定義的關聯關系進行查詢。我們直接貼出實現代碼:
$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);
唯一需要注意的是 groupBy 的字段,與 select 所指定的聚合函數。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Laravel如何根據關聯模型條目數量排序”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。