whereDate('created_at', '>=', $request->start) ->whereDate('created_at', '<=', $request->end) ->whereBrandId($service->brand->id)->get(); return new BrandStatsResource($stats); } /** * Get statistics for a specific question. * * @param \App\Http\Requests\Api\V2\GetQuestionStatsRequest $request * @param \App\Models\Question $question * @return \App\Http\Resources\Api\V2\QuestionStatsResource */ public function questionStats( GetQuestionStatsRequest $request, Question $question ): \App\Http\Resources\Api\V2\QuestionStatsResource { // * Make sure we are accessing a customer that belongs to our service. $this->authorize('questionBelongsToService', $question); $answers = $question->answers; $start = Carbon::parse($request->start); $end = Carbon::parse($request->end); return new QuestionStatsResource( $this->answersByDays($answers, $start, $end), $question ); } /** * Total réponses par dates. * * @param \Illuminate\Support\Collection $answers * @param \Illuminate\Support\Carbon $start * @param \Illuminate\Support\Carbon $end * @return \Illuminate\Support\Collection */ private function answersByDays(Collection $answers, Carbon $start, Carbon $end): \Illuminate\Support\Collection { // * Totalize by date all answers. $answersByDays = ModelAnswer::query() ->whereDate('created_at', '>=', $start) ->whereDate('created_at', '<=', $end) ->whereIn('answer_id', $answers->pluck('id')) ->get() ->map(function ($custAnswer) { return [ 'answer_id' => $custAnswer->answer_id, 'created_at' => $custAnswer->created_at->isoFormat('YYYY-MM-DD'), ]; }) ->groupBy(['created_at', 'answer_id']) ->map(function ($day) { return $day->map(function ($custAnswers) { return $custAnswers->count(); }); }); do { $currentDate = $start->isoFormat('YYYY-MM-DD'); /** @var \Illuminate\Support\Collection $answersByDays */ if (!$answersByDays->has($currentDate)) { $answersByDays->put( $currentDate, $answers->mapWithKeys(function ($answer) { return [$answer->id => 0]; }) ); } else { $curentAnswers = $answersByDays->pull($currentDate); $answersByDays->put( $currentDate, $answers->mapWithKeys(function ($answer) use ($curentAnswers) { return [$answer->id => $curentAnswers->has($answer->id) ? $curentAnswers->get($answer->id) : 0]; }) ); } $start = $start->addDay(); } while ($start->lessThanOrEqualTo($end)); return $answersByDays; } }