处理phpMyAdmin的原始Mysql查询在laravel

时间:2018-03-08 20:59:29

标签: mysql laravel eloquent

我有这个Eloquent查询:

return DB::table('users')
        ->leftJoin('bet', function($join) use ($competition_id){
          $join->on('users.id', '=', 'bet.user_id');
          $join->on('bet.competition_id','=', DB::raw("$competition_id"));
        })
        ->select('users.*', DB::raw('SUM(points) as score'))->get();

它给我一个错误:

SQLSTATE [42000]:语法错误或访问冲突:1140如果没有GROUP BY子句,则GROUP GROUP列(MIN(),MAX(),COUNT(),...)的混合没有GROUP列是非法的( SQL:选择users。*,SUM(点数)作为users左侧加入bet的分数usersid = {{1} }。betuser_idbet = 1

如果我只是在PhpMyAdmin中复制粘贴生成的SQL(以粗体显示),它可以完美地运行......

你能帮我解决一下这个问题吗?因为这对我没有意义......

谢谢

问题只是缺少的群体:

competition_id

解决方案#2

根据MySQL的版本或配置,上面的解决方案不起作用,我必须按照Eric的建议将所有字段分组:

return DB::table('users')
    ->leftJoin('bet', function($join) use ($competition_id){
      $join->on('users.id', '=', 'bet.user_id');
      $join->on('bet.competition_id','=', DB::raw("$competition_id"));
    })
    ->select('users.*', DB::raw('SUM(points) as score'))->groupBy('users.id')->get();

1 个答案:

答案 0 :(得分:2)

我有很多问题,但4.是它的原因

  1. 你为什么不使用ORM?你应该尽可能利用这个框架
  2. 为什么DB :: raw on $ competition_id?它只是您要插入查询的值
  3. 您可以在最终选择中使用selectRaw以避免使用另一个DB :: raw
  4. 很可能缺少一个groupBy(你的总和有问题)。您可以通过在MySql上放置group by或禁用严格模式
  5. 来完成此操作

    试试这个:

    return DB::table('users')
            ->leftJoin('bet', function($join) use ($competition_id){
              $join->on('users.id', '=', 'bet.user_id');
              $join->on('bet.competition_id','=', DB::raw("$competition_id"));
            })
            ->select('users.*', DB::raw('SUM(points) as score'))->groupBy('users.id')->get();