【问题标题】:Query count base on date groupBy Type - Laravel基于日期组的查询计数按类型 - Laravel
【发布时间】:2021-03-15 17:55:37
【问题描述】:

我的目标是构建这些数据。

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');

我现在有点卡住了。

如何优化我的查询?

【问题讨论】:

  • 当您不需要时,您仍在循环内运行查询。将所有这些添加到第一个查询中,并将其从循环中删除。
  • 但是,如果我将其取出,我将如何访问所有日期? $logDate
  • 如果您想提出您的查询建议,我现在就试试。

标签: php laravel laravel-5 laravel-7


【解决方案1】:

可以在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,

   ]);
   
}

【讨论】:

  • 现在让我试试。
  • 结果:我得到了Call to a member function format() on null
  • 我打错字了,意思是updated_at 不是我写的乱码
  • 也忘了添加提要,所以现在更新了
  • 这是我的代码,我知道它不是最好的,但是和你的相比,我的代码对性能有影响吗? i.imgur.com/WOhocv2.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2023-03-29
相关资源
最近更新 更多