簡體   English   中英

Laravel Eloquent 關系:如果我們已經預先加載了關系,我們使用關系計數還是集合計數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM