大家知道這個東西嗎?
它也可以幫你透過設定好的關聯,計算出該關聯的數量。
大部分沒有載入大量資料的場景,你的確不一定要這樣用。
<?php
$factories = FoxconnFactory::select('id', 'address')->with('workers')->get();
$counts = $factories->map(function ($factory) {
return $factory->workers->count();
})
一般這樣子都還不會造成什麼問題~
承接上面的程式碼,
如果富士康的員工超級無敵世界宇宙大覺者的多,(訂個數字:122617筆)
那麼在 Laravel 一次把這麼多筆資料撈回來的時候,就會出問題了!
比如說:
source code
callstack:
- Eloquent/Builder::get()
- Eloquent/Builder::eagerLoadRelations()
- Eloquent/Builder::loadRelation()
- $relation->getEager()
- $relation->match()
而且別忘了~
Laravel還會對每一個剛撈出來的 model 的資料(attribute)作型別轉換(casts)!
這樣子你應該可以想到不僅資料庫的壓力頗大,
cpu 的壓力更是大到想哭、記憶體也可能回憶起被巨大資料量蹂躪的恐懼。
withCount() comes to our rescue!
如果你只是單純的需要計算關聯的數量,並不需要拿關聯的資料來操作,
它可以幫你用 subquery (SQL) 作計算,
並會把它放在「{$relation}_count
」這個欄位!
這樣子你就能不免在載入關聯時消耗掉過多的運算資源了!
如果你想衡量這樣作的成效,
我想最好的辦法應該是用 git 開個分支出來,
並搭配 debugbar 比較改動前後,花在運算及 sql 上的時間~