這篇文章主要介紹了Laravel如何根據(jù)關(guān)聯(lián)模型條目數(shù)量排序,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在崇禮等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站設(shè)計 網(wǎng)站設(shè)計制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,崇禮網(wǎng)站建設(shè)費用合理。
在laravel中我們使用模型操作數(shù)據(jù)庫表,同時使用 hasOne belongTo hasMany 等關(guān)聯(lián)關(guān)系模型 建立不同模型之間的關(guān)聯(lián)。對于簡單的查詢操作這完全應(yīng)付的來。
可是現(xiàn)實的業(yè)務(wù)需求往往充滿變數(shù),今天我們就說一個需求, 根據(jù)關(guān)聯(lián)模型的數(shù)量進(jìn)行排序,應(yīng)該如何寫代碼。
學(xué)習(xí)時間
我們用實例進(jìn)行解釋,首先是表結(jié)構(gòu),為了簡化操作,只羅列出主要的字段。首先是 hackathons 表的兩個字段:
id
name
begins
ends
description
然后是 user 表的字段:
id
name
還有一個關(guān)聯(lián)表 hackathon_user 字段:
hackathons_id
user_id
好了,基礎(chǔ)數(shù)據(jù)已經(jīng)建立,接著我們使用laravel的模型操作數(shù)據(jù)庫表。首先聲明 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 模型因為與本文所討論問題無關(guān),因此不予列出。接著定義關(guān)聯(lián)表的模型:
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'); } }
這就是我們需要的基礎(chǔ)類,接著說如何排序。如果不考慮性能問題,或者篩選出的數(shù)據(jù)量還不足以讓我們考慮到性能問題, 那么可以先把結(jié)果數(shù)據(jù)集整個返回,然后使用 laravel collection 集合進(jìn)行排序和操作。代碼寫起來像下面這樣:
$hackathons = Hackathon::with('participants')->get()->sortBy(function($hackathon) { return $hackathon->participants->count(); });
注意在使用 get 獲取所有的結(jié)果數(shù)據(jù)集之后,調(diào)用的是Collection類的 sortBy 方式,默認(rèn)是升序排列。這個方法在數(shù)據(jù)量小的時候,沒什么問題。
如果你的數(shù)據(jù)量很大,動輒幾十萬條,那么上面的 get 方法,萬萬是不能用的,這會大大地增加MySQL與服務(wù)器之間的數(shù)據(jù)傳輸壓力。所以,我們需要在MySQL層面,盡量解決這個問題。
聚合查詢也是關(guān)系型數(shù)據(jù)庫的強(qiáng)項,所以我們需要的是把聚合查詢用laravel實現(xiàn)出來。
laravel 5.3 及以上,我們可以使用 withCount 進(jìn)行關(guān)聯(lián)類的聚合查詢了,代碼只需一行:
Hackathon::withCount('participants')->orderBy('participants_count', 'desc')->paginate(10);
注意laravel自動生成的統(tǒng)計類的字段名不能寫錯。
還有一種方法,就是不使用關(guān)聯(lián)模型,而該用表連接,繞過模型定義的關(guān)聯(lián)關(guān)系進(jìn)行查詢。我們直接貼出實現(xiàn)代碼:
$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 所指定的聚合函數(shù)。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Laravel如何根據(jù)關(guān)聯(lián)模型條目數(shù)量排序”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
新聞名稱:Laravel如何根據(jù)關(guān)聯(lián)模型條目數(shù)量排序
文章地址:http://chinadenli.net/article16/jiijgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、Google、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)