2017-11-15 23 views
0

私はカウントが必要です。結果を取得したり、各行ごとにクエリを実行する必要はありません。これが私が熱心なロードを望む理由です。

熱心な読み込みとhasManyThrough関係から数えてください(数のみ必要です)

Admins 
    id 

Posts 
    id 
    admin_id 

Comments 
    id 
    user_id //nullable (null if comment from admin) 
    admin_id //nullable (null if comment from user) 
    news_id 

は、今私は、単一の管理者からのすべての投稿と投稿のためのすべてのコメントを取得せずに、これらの記事から数えるすべてのコメントを取得したい、ONLY COUNT:

は、私は次のような3つのテーブルを持っています n + 1のクエリの問題を避けるために熱心に読み込んでください。ここで

私たちは、次のような積極的なロードで使用する関係を作るべきだと思う:

//admin model  
public function commentsCountRelation() 
     { 
      return $this->hasManyThrough(Comment::class, News::class, 'admin_id', 'news_id') 
       ->selectRaw('news_id, count(*) as count') 
       ->groupBy('news_id'); 

     } 

--Look news_idがAdminsテーブルにない、ので、ここで私はhasManyThrough関係を使用していました。

は、その後、私は、属性をしなければならないように、easylyのカウントにアクセスするには:

public function getCommentsCountAttribute() 
    { 
     return $this->commentsCountRelation->first()->count ?? 0; 
    } 

そして、それが好きアクセス:

$admin = Admin::with('commentsCountRelation')->findOrFail($id); 
$admin->commentsCount; 

をしかし、それは常にnullを返し、それはなぜですか?すべてのヘルプは非常にhasManyThroughを使用する必要がない

答えて

2

を理解されるであろう

//relation 
public function ordersCountRelation() 
    { 
     return $this->hasOne(Order::class)->selectRaw('user_id, count(*) as count') 
      ->groupBy('user_id'); 

    } 

//attribute 
public function getOrdersCountAttribute() 
    { 
     return $this->ordersCountRelation->count ?? 0; 
    } 

//Then accessed like: 
$user = User::with('ordersCountRelation')->find($id); 
$user->ordersCount; //return only count 

hasMany & belongsToため

次の作品は、私は次のように私の他のモデルにそれを使用しました。私は理解していなかった$comments_count

+0

:その後、あなたがそれにアクセスすることができます

$admin->posts->withCount('comments')->get();


ちょうどいくつかの関係やwithCountメソッドを使用します。アプリには複数の管理者がおり、すべてに投稿があります。特定の管理者からのすべての投稿とすべてのコメントが必要です。 質問には私はテーブルの構造を説明しました。私は 'Admin'モデルで作業している間にコメントカウントが必要です どうすればいいですか? 'hasManyThrough'を使わないでこれを行うのですか?私はすべての投稿をカウントしたくないだけですが、この管理者の投稿のみを取得したいのです。 '$ admin-> post-> commentCount' コード例を書いたり、簡単に説明していただければ幸いです – APu

+0

関係:' Admin'は 'hasMany'に' Post'は 'hasMany'と' Comment'を持っています – APu

+0

あなたのメソッドが熱心な読み込みを使用していないと思いますか? また、あなたは '$ admin-> post-> comments-> count()'の代わりに、あなたの言及方法を使って効率的なメリットを教えてください。 – APu

関連する問題