如何解决如何使用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]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。