[英]Laravel Eloquent Relationship: Do we use relationship count or collection count if we already eager loaded the relationship?
我有兩個主要問題,都與 eloquent 的熱切加載有關。
因為我們已經預先加載了關系,所以我們已經加載了對象。 例如, Tag::with('posts');
將急切地加載標簽的所有帖子。 然后如果我想計算第一個標簽的帖子數,最好使用Tag::first()->posts()->count()
或Tag::first()->posts->count()
?
我知道通常答案是第一個,因為我們不想加載所有 collections 而是只想使用一個查詢來完成。 但是,在這種情況下,我假設我們已經加載了 collections,所以就像我們已經支付了費用,因此我覺得在這種情況下第二個會更好?
旁注:我知道在這種情況下我們可以使用withCount('posts')
,但我的意思是了解何時使用關系計數與集合計數。
我還想知道我們是否已經使用了Tag::with('posts')
,那么如果我想計算第一個標簽的帖子,使用Tag::first()->posts()->count / Tag::first( )->posts->count
會更快嗎Tag::first()->posts()->count / Tag::first( )->posts->count
或使用Tag::withCount('posts')->with('posts')
我背后的邏輯是,如果我們只需要計數, withCount()
會很快,但是如果我們已經加載了關系並且同時還想獲得計數呢?
計數的成本取決於您的數據庫有多大。 一種常見的方法是使用緩存。 對於大型數據庫,更快幾乎總是意味着使用緩存,但緩存不會 100% 准確,因為緩存應該在設定的時間更新。
而且,如果您要在大型集合上運行 count,您肯定會面臨 memory 問題。
對於第一個,您可以使用調試器來分析使用每種方法發生的情況,從而學到很多東西。 還要注意 laravel 的loadCount()
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.