Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如何在拉威尔获得排名_Laravel_Eloquent_Laravel 5.3 - Fatal编程技术网

Laravel 如何在拉威尔获得排名

Laravel 如何在拉威尔获得排名,laravel,eloquent,laravel-5.3,Laravel,Eloquent,Laravel 5.3,在我的Laravel5.3应用程序中,投票表有一个净投票列。我想根据净票数找到视频的排名。我想显示如下列表所示的排名。我知道sql@raw方法。但是,我想用拉威尔方法。因为,还有一些其他的表与这个用户表连接,一些其他的卖空也需要完成 视频表: id | net_votes| video_id | ------ | -------: |:-------: | 1 | 5 | 1 | 2 | 11 | 2 |

在我的Laravel5.3应用程序中,投票表有一个净投票列。我想根据净票数找到视频的排名。我想显示如下列表所示的排名。我知道sql@raw方法。但是,我想用拉威尔方法。因为,还有一些其他的表与这个用户表连接,一些其他的卖空也需要完成

视频表:

id     | net_votes| video_id | 
------ | -------: |:-------: |
1      |    5     |   1      |   
2      |    11    |   2      |   
3      |    3     |   1      |    
4      |    6     |   3      |    
5      |    5     |   2      |     
我想得到这样的结果

id     | net_votes| rank
------ | -------: |:----:
2      |    11    |   1
4      |    6     |   2
1      |    5     |   3
5      |    5     |   4
3      |    3     |   5
$subquery = "( 
     SELECT    username, 
               first_name, 
               video_title, 
               net_votes, 
               Sum(net_votes) AS total 
     FROM      videos 
     LEFT JOIN users 
     ON        videos.user_id = users.id 
     LEFT JOIN profile 
     ON        users.id = profile.user_id 
     GROUP BY  videos.id 
     ORDER BY  total DESC, 
               videos.created_at DESC ) totals";


$score_board_list = DB::table(DB::raw($subquery))
->select(
    '*', 
    'total', 
    DB::raw('@r:=@r+1 as rank'), 
    DB::raw('@l:=total'))
->get();
我现在正在使用这个代码。它起作用了。但我想用拉威尔雄辩的方法

$score_board_list = DB::select("SELECT *, total, @r:=@r+1 as rank,
           @l:=total FROM ( select username, first_name, video_title, 
           net_votes, sum(net_votes) as total from videos
           LEFT JOIN users ON videos.user_id = users.id
           LEFT JOIN profile ON users.id = profile.user_id
           group by videos.id order by total desc, videos.created_at desc ) totals, (SELECT @r:=0, @l:=NULL) rank");
这样做

将子查询存储到变量中

$subquery = "( 
     SELECT    username, 
               first_name, 
               video_title, 
               net_votes, 
               Sum(net_votes) AS total 
     FROM      videos 
     LEFT JOIN users 
     ON        videos.user_id = users.id 
     LEFT JOIN profile 
     ON        users.id = profile.user_id 
     GROUP BY  videos.id 
     ORDER BY  total DESC, 
               videos.created_at DESC ) totals";
然后相当于

Select * from (subquery)
变成雄辩的是

DB::table(DB::raw('subquery'))
然后选择一个自定义列

// for example  
->select(DB::raw('@r:=@r+1 as rank'))
因此,您的查询生成器如下所示

id     | net_votes| rank
------ | -------: |:----:
2      |    11    |   1
4      |    6     |   2
1      |    5     |   3
5      |    5     |   4
3      |    3     |   5
$subquery = "( 
     SELECT    username, 
               first_name, 
               video_title, 
               net_votes, 
               Sum(net_votes) AS total 
     FROM      videos 
     LEFT JOIN users 
     ON        videos.user_id = users.id 
     LEFT JOIN profile 
     ON        users.id = profile.user_id 
     GROUP BY  videos.id 
     ORDER BY  total DESC, 
               videos.created_at DESC ) totals";


$score_board_list = DB::table(DB::raw($subquery))
->select(
    '*', 
    'total', 
    DB::raw('@r:=@r+1 as rank'), 
    DB::raw('@l:=total'))
->get();

用户根据净投票数的排名-->您可以按净投票数的降序排列,瞧,您得到了第一名、第二名等。。好吧,至少,给了我们一个你尝试过的例子。。同样**与这个用户表**是相当有趣的,如果你认为它是至关重要的,张贴它也…详细到possible@BagusTesa我已经编辑了我的问题。谢谢。你是说你想使用laravel查询生成器?是的@新手:你应该研究MVC,并且有说服力。使用Laravel 5.3并进行这样的原始查询毫无意义。。。