php - Laravel - 从两个数据透视表中获取计数作为一个数字

标签 php mysql laravel eloquent

我有一个包含 articles 的表和两个数据透视表 viewsvotes 用于包含 article_id 列的文章和 user_id。对于文章,我有一个 publish 列,我可以在其中检查文章是否已发布。我需要按受欢迎程度进行查询,我从两个数据透视表中获取所有已发表的文章及其计数,其中表中的每个投票 votes counts as 3,并且每个从表 views counts 中计数为 1。不知道该怎么做,我之前有一个查询,我在哪里获得只计算投票数的已发表文章,但我只得到有一些投票的文章,而不是那些已发表但没有投票的文章。在新查询中,我还需要添加 View ,更改计数逻辑,包括已发布的文章而不是 View ,并根据这两个数据透视表中的计数对它们进行排序。

所以,想要的输出应该是这样的:

[{"id":117,"popularityCount":17},{"id":118,"popularityCount":15},{"id":121,"popularityCount":13}]

这是查询,但我不再需要它了:

$articles = DB::table('articles')
        ->select([DB::raw('articles.id'), DB::raw('COUNT(*) as "votes"')])
        ->join('votes', 'article_id', '=', 'articles.id')
        ->where('articles.publish', 1)
        ->groupBy('votes.article_id')
        ->orderBy('votes', 'desc')
        ->get();

        return $articles;

最佳答案

如果将来有人需要的话,这最终对我有用!

$result = Article::select('articles.*', 'v.vote_count', 'vw.view_count')
            ->where('publish', 1)
            ->leftJoin(DB::raw('(SELECT votes.article_id, COUNT(*) AS vote_count FROM votes GROUP BY votes.article_id) v'), 'v.article_id', '=', 'articles.id')
            ->leftJoin(DB::raw('(SELECT views.article_id, COUNT(*) AS view_count FROM views GROUP BY views.article_id) vw'), 'vw.article_id', '=', 'articles.id')
            ->orderByRaw('(v.vote_count * 3) + vw.view_count DESC')
            ->where('created_at', '>', $date->format('Y-m-d') . ' 00:00:00')
            ->get();

关于php - Laravel - 从两个数据透视表中获取计数作为一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38350758/

相关文章:

php - 返回 Laravel 中非空的行

php - 如何在php中获取JSON数据? [复制]

Java JDBC MySQL连接错误: ClassNotFoundException

javascript - 如何设置导航栏的事件状态?

mysql - 将 MySQL 转换为 MS Access

php - 在 Laravel 中使用带有 OUT 参数的存储过程

mysql - Laravel 迁移 - 违反完整性约束 : 1452 Cannot add or update a child row: a foreign key constraint fails

php - 使用未定义的常量 REQUEST_URI - 在第 73 行的 functions.php 中假定为 'REQUEST_URI'

php - 有没有办法让 PHP(或 jQuery)检查字符串是否可读?

php - 用 Zend 实现文件上传进度