中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel如何根據關聯模型條目數量排序

發布時間:2021-12-28 16:55:12 來源:億速云 閱讀:314 作者:小新 欄目:大數據

這篇文章主要介紹了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如何根據關聯模型條目數量排序”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄石市| 临江市| 页游| 伊通| 新化县| 新津县| 东乡族自治县| 五指山市| 马公市| 祁阳县| 梨树县| 温宿县| 勐海县| 柏乡县| 云安县| 聂拉木县| 荆州市| 自贡市| 陇川县| 民丰县| 汾阳市| 宁远县| 日照市| 武城县| 青川县| 红安县| 遂川县| 龙江县| 五寨县| 吐鲁番市| 拉孜县| 西华县| 安吉县| 安阳县| 延庆县| 临潭县| 余干县| 临夏市| 克什克腾旗| 嘉峪关市| 昌图县|