如何使用laravel查询生成器与whereIn / whereBetween求和?

问题描述

我从查询中得到了错误的值。任何人都可以帮助我更正laravel项目中的查询MysqL代码

select SUM(amount) as total from `sales` 
where `bankid` = 1 
and `month` = 8 
and `year` = 2020
and userid in (select userid from user where bank_id=2 AND (usertype=1 OR usertype=2))

Laravel代码

function test($bank_id,$usertype,$month=NULL,$year=NULL){
    $query = Sales::query();
    if(is_numeric($bank_id)){
        $query->where('bankid',$bank_id);
    }
    if($month)
    $query = $query->where('month',$month);
    
    if($year)
    $query = $query->where('year',$year);

    $query = $query->select(DB::raw("SUM(amount) as total"));
    if(is_numeric($usertype)){
        $query->whereIn('userid',function ($query) use($bank_id,$usertype) {
            $query->select(DB::raw('userid'))
            ->from('user');            
            if(is_numeric($bank_id)){
                $query->where('bank_id',$bank_id);
            }                 
            if($usertype==1){
               // $query->whereBetween('usertype',[1,2]);
                $query->where('usertype',1);
                $query->orWhere('usertype',2);
            } else {
                $query->where('usertype',$usertype);
            }
        });
    } 
    return $query->get()->toarray()[0]['total'];
}

当我使用querylog并获得查询时:

DB::connection()->enableQueryLog(); 
dd($query->tosql(),$query->getBindings());

select SUM(amount) as total from `slaes` 
where `bankid` = 1 
and `month` = 8 
and `year` = 2020 
and `userid` in (select userid from `user` where `bank_id` = 1 and `usertype` =1 OR `usertype` = 2)

我需要将其从and userid in (select userid from user where bank_id = 1 and usertype =1 OR usertype = 2)更改为and userid in (select userid from user where bank_id = 1 and (usertype =1 OR usertype = 2))

任何人都可以建议在运行此查询时尽量减少加载问题。我的数据库中几乎有100万条记录。
谢谢。

解决方法

要将您的表达式放在Laravel ORM中,请在where内部使用回调函数,如下所示:

$query->where(function($query) {
  return $query
    ->where('usertype',1)
    ->orWhere('usertype',2);
});

但是您也可以使用最短方法:

$query->whereIn('usertype',[1,2]);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...