これは、より「ベストプラクティス」の質問です。
私のウェブサイトには記事があり、記事にはコメントを付けることができます。
public function comments() {
return $this->hasMany('App\Comment', 'submission_id');
}
記事が掲載されているフロントページには、コメントの量が表示されます。
@if ($article->comments->count())
{{ $article->comments->count() }}
{{ $article->comments->count() == 1 ? 'comment' : 'comments' }}
@endif
そして、私は自分自身に考えていました。この例では、私のデータベースはこの単純なコードスニペットに対して3回クエリされていますか?
この関係を通じてコメント数を取得するたびに、コメントの配列全体とそのすべての列が読み込まれますか?記事には1,000以上のコメントが含まれる場合があるためです。
もしそうならarticles
、コメントが投稿されるたびにインクリメントする列をデータベーステーブルに配置し、関係を介してではなく直接フェッチするのはベストプラクティスではないでしょうか。
あなたがそれをしている方法ではありません。を使用しているとき->count()
、およびそれがCollection
バージョンであるかバージョンであるかによって異なりますBuilder
。次の例を参照してください。
例1-comments()
メソッドを使用した新しいクエリ:
$article = Article::first();
$article->comments()->count();
この例では、を使用する$article->comments()
と、(Builder
クラスを使用して)新しいクエリが開始されます。このクエリをどのように終了するか、つまりを使用するかどうかに関係なく->first()
、->get()
または->count()
新しいクエリが実行されます。
ここで、例2-comments
プロパティを持つ新しいクエリ:
$article = Article::first();
$article->comments->count();
この例で$article->comments
は、リレーションシップがロードされているかどうかに関係なく、リレーションシップアクセサーの動作が異なるため、は新しいクエリを実行します。この場合、ロードされていないため$article->comments
、のBuilder
代わりにインスタンスを返すCollection
ため、クエリを終了すると新しいクエリが実行されます。
最後に、例3-プロパティをCollection
使用したアクセスcomments
:
$article = Article::with(["comments"])->first();
$article->comments->count();
この最後の例で$article->comments
は、は->with(["comments"])
句を介してロードされるように指定されているためCollection
、Builder
インスタンスではなく、です。このため、呼び出して->count()
使用しているCollection
カウント方法を、および追加のクエリを実行しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加