PHP这两段代码哪种更节省性能?

就是想在订单表里面查询某一用户所有订单数、昨日订单数、今日订单数这三个结果 第一种方式就是查询一次 然后foreach遍历查找符合条件的数据
第二种就是直接查询三次得到想要的结果 哪种更节约性能?如果是第一种的话还有简单的写法吗?有没有函数可以得到符合条件的结果 不用遍历?

$res=Order::where('uid',$uid)->get()->toArray();//某用户历史订单
$todayTime=mktime(0,0,0,date('m'),date('d'),date('Y'));
$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
static $t=0;  //今日总的订单
static $y=0;  //昨日总的订单
foreach ($res as $k => $v) {
    if($v['time']>$todayTime){
        $t+=1;
    }
    if($res[$k]['time']>$beginYesterday&&$res[$k]['time']<$endYesterday){
        $y+=1;
    }
}
$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
$todayTime=mktime(0,0,0,date('m'),date('d'),date('Y'));
$res=Order::where('uid',$uid)->get()->toArray();//总的订单
$res2=Order::where('uid',$uid)->where('time',>,$todayTime)->get()->toArray();//今日总的订单
$res3=Order::where('uid',$uid)->where('time',>,$beginYesterday)->where('time',<,$endYesterday)->get()->toArray();//昨日总的订单
阅读 1.2k
1 个回答

既然只是取订单数,应该直接用 count,而不是用 get 去取结果集。
使用查询分组,把两天的按照日期进行分组并 count ,一条语句就可以取出来结果。

// 总共
$total = Order::where('uid',$uid)->count();
// 昨天和今天
$yesterday = \Carbon\Carbon::yesterday();
$now = \Carbon\Carbon::now();
$last2day = Order::where('uid',$uid)
->whereBetween('time',[$yesterday,$now])
->select(['date(time) as date',count(1) as count])
->groupBy(DB::raw('date(`time`)'))
->get()
->pluck('count','date');
// 今天
$today = $last2day->get($now->toDateString(),0);
// 昨天
$yesterday = $last2day->get($yesterday->toDateString(),0);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题