根据日期组类型查询计数 - Laravel
Query count base on date groupBy Type - Laravel
我的目标是构建这个数据。
753
它现在可以工作了,但是它做了很多查询才能得到我需要的东西。
我试过了
$logs = BabyLog::where('babyId',$baby->id)->get();
$graphData = [];
foreach($logs as $i => $log){
if(strtotime($log->updated_at) < strtotime(date('Y-m-d H:i:s'))){
$logTime = strtotime($log->updated_at);
$logDate = date('Y-m-d', $logTime );
$logsOnThatDay = BabyLog::whereDate('updated_at', '=', $logDate)->where('babyId',$baby->id)->get();
// dd($logsOnThatDay,$logDate);
$pee = 0;
$poop = 0;
$feed = 0;
$medicine = 0;
$sleep = 0;
foreach($logsOnThatDay as $j => $logOnThatDay){
// dd($logOnThatDay);
if($logOnThatDay->type == 'pee'){
$pee++;
}
if($logOnThatDay->type == 'poop'){
$poop++;
}
if($logOnThatDay->type == 'feed'){
$feed++;
}
if($logOnThatDay->type == 'medicine'){
$medicine++;
}
if($logOnThatDay->type == 'sleep'){
$sleep++;
}
}
$graphData[$logDate]['pee'] = $pee;
$graphData[$logDate]['poop'] = $poop;
$graphData[$logDate]['feed'] = $feed;
$graphData[$logDate]['medicine'] = $medicine;
$graphData[$logDate]['sleep'] = $sleep;
}
// dd($graphData);
}
我试过像这样增强它
$logs = BabyLog::whereDate('updated_at', '=', date('Y-m-d H:i:s'))
->whereIn('type', ['feed', 'pee', 'poop','medicine','sleep'])
->selectRaw('type, count(type) as count')
->groupBy('type')
->get()
->keyBy('type');
我现在有点卡住了。
如何优化我的查询?
您可以在 PHP 端进行分组:
$logs = BabyLog->where('babyId',$baby->id)->get()->groupBy(function ($log) {
return $log->updated_at->format('y-m-d');
});
foreach($logs as $date => $logsOnThatDay) {
// here on you can probably use the code you already have but this below might be shorter
$graphData[$date] = $logsOnThatDay->reduce(function ($acc, $log) {
if (array_key_exists($log->type, $acc)) { $acc[$log->type]++; }
return $acc;
}, [
'pee' => 0,
'poop' => 0,
'feed' => 0,
'medicine' => 0,
'sleep' => 0,
]);
}
我的目标是构建这个数据。
753
它现在可以工作了,但是它做了很多查询才能得到我需要的东西。
我试过了
$logs = BabyLog::where('babyId',$baby->id)->get();
$graphData = [];
foreach($logs as $i => $log){
if(strtotime($log->updated_at) < strtotime(date('Y-m-d H:i:s'))){
$logTime = strtotime($log->updated_at);
$logDate = date('Y-m-d', $logTime );
$logsOnThatDay = BabyLog::whereDate('updated_at', '=', $logDate)->where('babyId',$baby->id)->get();
// dd($logsOnThatDay,$logDate);
$pee = 0;
$poop = 0;
$feed = 0;
$medicine = 0;
$sleep = 0;
foreach($logsOnThatDay as $j => $logOnThatDay){
// dd($logOnThatDay);
if($logOnThatDay->type == 'pee'){
$pee++;
}
if($logOnThatDay->type == 'poop'){
$poop++;
}
if($logOnThatDay->type == 'feed'){
$feed++;
}
if($logOnThatDay->type == 'medicine'){
$medicine++;
}
if($logOnThatDay->type == 'sleep'){
$sleep++;
}
}
$graphData[$logDate]['pee'] = $pee;
$graphData[$logDate]['poop'] = $poop;
$graphData[$logDate]['feed'] = $feed;
$graphData[$logDate]['medicine'] = $medicine;
$graphData[$logDate]['sleep'] = $sleep;
}
// dd($graphData);
}
我试过像这样增强它
$logs = BabyLog::whereDate('updated_at', '=', date('Y-m-d H:i:s'))
->whereIn('type', ['feed', 'pee', 'poop','medicine','sleep'])
->selectRaw('type, count(type) as count')
->groupBy('type')
->get()
->keyBy('type');
我现在有点卡住了。
如何优化我的查询?
您可以在 PHP 端进行分组:
$logs = BabyLog->where('babyId',$baby->id)->get()->groupBy(function ($log) {
return $log->updated_at->format('y-m-d');
});
foreach($logs as $date => $logsOnThatDay) {
// here on you can probably use the code you already have but this below might be shorter
$graphData[$date] = $logsOnThatDay->reduce(function ($acc, $log) {
if (array_key_exists($log->type, $acc)) { $acc[$log->type]++; }
return $acc;
}, [
'pee' => 0,
'poop' => 0,
'feed' => 0,
'medicine' => 0,
'sleep' => 0,
]);
}