求教,获取昨日订单金额,今日订单额更佳优雅的写法

//昨天销售额
$user_promote_money_yesterday = UserPromoteOrder::where('promote_user_id', \Auth::id())->where('created_at', 'like', '%' . Carbon::yesterday()->format('Y-m-d') .'%')->sum('percentage_amount');
//今日销售额
$user_promote_money_today = UserPromoteOrder::where('promote_user_id', \Auth::id())->where('created_at', 'like', '%' . Carbon::now()->format('Y-m-d') .'%')->sum('percentage_amount');
//今日订单数
$user_promote_money_today_num = count(UserPromoteOrder::where('promote_user_id', \Auth::id())->where('created_at', 'like', '%' . Carbon::now()->format('Y-m-d') .'%')->get());

感觉。。。我这个写法有点多余,所以你们是怎么写

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
$yesterday = date('Y-m-d', strtotime('-1 day'));

// 昨天销售额
$user_promote_money_yesterday = UserPromoteOrder::where('promote_user_id', \Auth::id())->whereBetween('created_at', [$yesterday . ' 00:00:00', $yesterday . ' 23:59:59'])->sum('percentage_amount');

$today = date('Y-m-d');

// 今日销售额&今日订单数
$user_promote_today = UserPromoteOrder::where('promote_user_id', \Auth::id())->whereBetween('created_at', [$today . ' 00:00:00', $today . ' 23:59:59'])->select([DB::raw('SUM(`percentage_amount`) AS `today_amount`'), DB::raw('COUNT(*) AS `today_num`')])->first();

楼上正解:先加索引,然后再谈优雅

4年前 评论
讨论数量: 9
Jourdon
where('created_at', 'like', '%' . Carbon::now()->format('Y-m-d') .'%')

这个你是认真的? 为啥要用like? 拿到今天的开始时间,结束时间,直接用between不好吗?

4年前 评论
Epona

我会先把昨天和今天的订单全查出来,然后再用php计算昨天和今天的相关东西。

4年前 评论

为什么用like 用,whereDate就好了

4年前 评论

既然都优雅了,为什么还要用 like

4年前 评论

created_atpromote_user_id加个联合索引,用between吧,然后在谈优雅的事情

4年前 评论
$yesterday = date('Y-m-d', strtotime('-1 day'));

// 昨天销售额
$user_promote_money_yesterday = UserPromoteOrder::where('promote_user_id', \Auth::id())->whereBetween('created_at', [$yesterday . ' 00:00:00', $yesterday . ' 23:59:59'])->sum('percentage_amount');

$today = date('Y-m-d');

// 今日销售额&今日订单数
$user_promote_today = UserPromoteOrder::where('promote_user_id', \Auth::id())->whereBetween('created_at', [$today . ' 00:00:00', $today . ' 23:59:59'])->select([DB::raw('SUM(`percentage_amount`) AS `today_amount`'), DB::raw('COUNT(*) AS `today_num`')])->first();

楼上正解:先加索引,然后再谈优雅

4年前 评论

谢谢大家的指导,入门新手,谢谢大家

4年前 评论

能一句Sql解决的事情不要重复操作,条件不一样的话就用集合(collect)筛选处理。

$today = date('Y-m-d');
$yesterday = date('Y-m-d', strtotime('-1 day'));

$promoteMoney = UserPromoteOrder::select([DB::raw('FROM_UNIXTIME(datadate,'%Y-%m-%d') AS datadate'), DB::raw('SUM(`percentage_amount`) AS `amount`'), DB::raw('COUNT(*) AS `pay_num`')])->where('promote_user_id', \Auth::id())->whereBetween('created_at', [$yesterday . ' 00:00:00', $today . ' 23:59:59'])->groupByRaw("FROM_UNIXTIME(datadate,'%Y-%m-%d')")->first();

// 昨天销售额
$yesterday_amount = $promoteMoney[$yesterday]['amount'];
$yesterday_pay_num = $promoteMoney[$yesterday]['pay_num'];
// 今日销售额&今日订单数
$yesterday_amount = $promoteMoney[$today]['amount'];
$yesterday_pay_num = $promoteMoney[$today]['pay_num'];
1年前 评论
wongvio (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!