【问题标题】:Combine count result to join in laravel结合计数结果加入 laravel
【发布时间】:2016-09-25 17:54:31
【问题描述】:

我想得到类似新闻列表和评论数量的东西

文章 ------------- 评论
新闻1 ---------------- 10
新闻2 ---------------- 2
新闻3 ---------------- 13
新闻4 ---------------- 25

我知道如何用原始 sql 来做,但不能用 laravel 做。 laravel 可以处理原始查询,但我不想将它用于整个查询。
这是我当前的剪切代码:

$newslist = News::where('status_id', 2)->orderBy('id', 'desc')->skip(0)->take($itemPerLoad)
        ->join('msuser', 'msuser.id', '=', 'news.user_id')
        ->select(....)->get();

我已尝试将计数放在 select 方法上,但出现错误(上面未写的加入评论表)

->select('news.id', 'count(mscomment.id) as commented', ...)

因为无法加入,目前我使用单独的代码来统计它并设置为json响应

$commented = Comment::where('news_id', $news->id)->count();

我认为它不是获取数字的好方法,因为它会为每个循环请求计数

【问题讨论】:

  • 您是否尝试过像这样使用 selectRaw->selectRaw('news.id', 'count(mscomment.id) as commented', ...).
  • 它给了我这个错误:传递给 Illuminate\Database\Query\Builder::selectRaw() 的参数 2 必须是数组类型,给定字符串
  • 对不起,这是我的错误。在一个字符串中传递所有列,如下所示:->selectRaw('news.id, count(mscomment.id) as commented').
  • count() 方法有效,但就我而言,现在我更喜欢 huuk 答案。

标签: mysql laravel-5 lumen-5.2


【解决方案1】:

使用 Eloquent relations

News.php

public function comments()
{
    return $this->hasMany('NAMESPACE_TO_YOUR_MODEL\Comment');
}

然后在控制器中

$news = News::with('comments')->get();
$summary = [];
foreach($news as $n)
{
    $summary[] = ['article' =>$n->article, 'comments' => $n->comments->count()];
}

或者你可以在视图中迭代:

@foreach($news as $n)
    <tr>
        <td> {{ $n->article }} </td>
        <td> {{ $n->>comments->count() }} </td>
    </tr>
@endforeach

我认为这种方式是规范的

【讨论】:

  • 这个根据需要运行良好。也让我注意到 eloquent-relationships 功能。谢谢
猜你喜欢
  • 2015-07-22
  • 2017-10-19
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多