91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

永福县| 巨野县| 霍林郭勒市| 宜城市| 革吉县| 区。| 密云县| 日喀则市| 馆陶县| 西宁市| 商水县| 和顺县| 新田县| 北辰区| 五河县| 广元市| 高平市| 枝江市| 甘孜县| 读书| 大名县| 黑河市| 荣昌县| 遵义县| 乌恰县| 伊宁县| 咸阳市| 洛隆县| 拜城县| 渝中区| 磴口县| 元阳县| 清镇市| 葫芦岛市| 瓦房店市| 本溪| 蓝田县| 雷州市| 台北市| 汉川市| 阿勒泰市|