2016-08-23 348 views
0

有许多分类(Category.php)在我的网站的索引,其中有许多委员会(Board.php)。 董事会可以有很多主题(Topic.php),并且主题可以有很多回复(Reply.php)。Laravel的hasMany关系计数

我想获取当前董事会的回复数,可能与预先加载。

我有一个办法,但它执行了太多的查询。我创建了一个post_count属性,然后遍历每个主题并收集多个回复。有没有办法选择当前主板的所有回复?

public function getPostCountAttribute() 
{ 
    $count = 0; 
    foreach ($this->topics()->withCount('replies')->get() as $topic) { 
     $count += $topic->replies_count; 
    } 
    return $count; 
} 

回答

0

试试吧

变化

$count = 0; 
foreach ($this->topics()->withCount('replies')->get() as $topic) { 
    $count += $topic->replies_count; 
} 

$topic_ids = $this -> topics -> pluck('id'); 
$reply_count = Reply::whereIn('id',$topic_ids) -> count(); 
+0

不应该whereIn()有两个参数?缺少参数2为Illuminate \ Database \ Query \ Builder :: whereIn()..我改为whereIn('topic_id',$ topic_ids),没有结果。 – dinomuharemagic

+0

@core_m。我更新了。 – KmasterYC

+0

打印并查看$ topics_ids是否提取您的ID。代码似乎没有错。 –

1

找到了一个不错的方式。尽管如此,如果有人找到更好的方法来解决这个问题,我会留下这个问题。

我宣布一个hasManyThrough关系,而所谓的计数():

Board.php:

public function replies() 
    { 
     return $this->hasManyThrough(Reply::class, Topic::class); 
    } 

然后叫:执行

$board->replies->count() 

30查询(前45 )。

不过,我想找到一个热心的方式来加载数据,得到的查询数量下降到2次或3的查询。

1

除了你reply,你可以做这样的事情。

public function repliesCount() { 
     return $this->replies()->selectRaw('board_id, count(*) as aggregate') 
         ->groupBy('board_id'); 
    } 

,并使用该使用如下

$board->repliesCount() 

请注意,你必须根据你改变查询。