Laravel,按相关模型SUM排序

时间:2017-07-15 09:02:46

标签: laravel

我和一个'用户之间有一个belongsToMany关系。和媒体'表。

我想在我的视图中按照'喜欢'的顺序显示媒体。总和(=每个媒体的受欢迎程度)与分页。例如,首先显示在用户中接收到最多喜欢的媒体。

我的数据库:

  'media' : id, name
  'media_user' : id, media_id, user_id, like 
  'users' id, name 

'喜欢不是布尔值但是整数但是整数,它可以是-1等......我想总结它。

我的用户模型中有:

class User extends Authenticatable
{
    public function medias()
    {
        return $this->belongsToMany('App\Media')->withPivot('like')->withTimestamps();
    }

    ...
}

我在另一篇文章中看到过类似的内容,但我无法让它发挥作用......

$medias=Media::leftJoin(
    DB::raw('(SELECT media_id, SUM(like) AS likes FROM media_user GROUP BY media_id) as v'),
    'v.media_id', '=', 'media.id'
)->orderBy('likes', 'desc')->paginate(20);

以下是我通过上述查询获得的例外

  

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MariaDB服务器版本相对应的手册,以便使用正确的语法,例如AS喜欢FROM media_user GROUP BY media_id)作为v on v.media_id = medi'在第1行(SQL:select count(*)as media from media` inner join(SELECT media_id,SUM(like)AS like FROM media_user GROUP BY media_id)as v on v.media_id = media.id)

谢谢!

1 个答案:

答案 0 :(得分:0)

我想是因为你的列名是like,这是一个保留的关键词。

https://mariadb.com/kb/en/mariadb/reserved-words/

尝试在反引号中包装like

$medias = Media::leftJoin(
    DB::raw('(SELECT media_id, SUM(`like`) AS likes FROM media_user GROUP BY media_id) as v'),
    'v.media_id', '=', 'media.id'
)->orderBy('likes', 'desc')->paginate(20);

希望这有帮助!