2017-07-15 72 views
0

我在'用户'和'媒体'表之间有一个belongsToMany关系。Laravel,根据相关型号排列SUM

我想在我的视图中按照'like'sum(=每种媒体的流行度)和分页显示媒体。例如,首先显示在用户中获得最多喜好的媒体。

我的DB:

'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服务器版本相对应的手册,以便在第1行附近使用as like as FROM media_user GROUP BY media_id)作为v on v.media_id = medi'(SQL:select count(*)as aggregate 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)

谢谢!

+0

如何/为什么不工作?即您是否收到错误?你没有得到任何结果?你得到的结果,但不是你所期望的? –

+0

以下是我在原始文章中写入的$ medias = Media :: leftJoin时得到的异常: SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与你的MariaDB服务器版本相对应的手册,以便在第1行的'v'.mediamedia'='medi'附近使用as like as AS like FROM media_user GROUP BY media_id)使用正确的语法(SQL:select count (*)作为来自'media'内部连接的聚合(SELECT media_id,SUM(like)AS like media_user GROUP BY media_id)作为v on'v'.media_id' ='media'.'id') –

回答

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); 

希望这有助于!

+0

它的工作原理!非常感谢! –