3
respostas

Problema na hora de receber um retorno int

Olá pessoal.

Estou com um problema na hora de pegar o return de uma função, alguém consegue me ajudar?

<?php

namespace App\Services\Reports;

use App\Helpers\IsUuid;
use App\Models\Subject;
use App\Models\ActivityLog;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;

class CommunityStatusService
{
    public function getRegularity(string $classId, int $cycleIs): ?Collection
    {
        if (!IsUuid::isValidUuid($classId)) {
            return null;
        }

         $subjectData = Subject::query()
            ->with([
                'subareas' => fn($query) => $query
                    ->join('subarea_classes', 'subarea_classes.subarea_id', '=', 'subareas.id')
                    ->with([
                        'activities' => fn($query) => $query
                            ->withCount([
                                'activityStudent' => fn($query) => $query->where('already_know', true)
                            ])
                            ->withCount([
                                'timer' => fn($query) => $query->where('timers.concluded_at', '<>', null)
                            ])
                            ->where('activities.is_exam', false)
                    ])
                    ->where('subarea_classes.cycle_is', $cycleIs)
                    ->where('subarea_classes.class_id', $classId)
                    ->where('subarea_classes.active', true)
                    ->orderBy('subarea_classes.cycle_is')
                    ->orderBy('subarea_classes.week_is')
            ])
            ->orderBy('subjects.name')
            ->get();

            //return $subjectData;
            return $this->getTotalActivities($subjectData);
    }



    private function getTotalActivities($subjectData): int
    {
        $total = 0;
        $totalAlreadyKnowOrConcludedAt = 0;

        foreach ($subjectData as $subject) {
            foreach ($subject->subareas as $item) {
                $total += $item['activities_count'];
                foreach ($item->activities as $activity) {
                    if ($activity['activity_student_count'] > 0 || $activity['timer_count'] > 0 ) {
                        $totalAlreadyKnowOrConcludedAt += 1;
                    }
                }
            }
        }

        return $total;
    }


}

Utilizando o Insomnia, ao testar a rota, ele da o seguinte erro:

"message": "Return value of App\Services\Reports\CommunityStatusService::getRegularity() must be an instance of Illuminate\Database\Eloquent\Collection or null, int returned"

3 respostas

Oi Renan, beleza?

Na assinatura do seu método você informa que deve retornar um null ou uma Collection: public function getRegularity(string $classId, int $cycleIs): ?Collection.

Porém você está retornando um número inteiro que é o resultado desse seu outro método: private function getTotalActivities($subjectData): int

Diego, sabe me dizer como soluciono isso? Pois preciso do valor inteiro que vem no getTotalActivities.

Oi Renan, faz muito tempo que não mecho com Laravel...

Mas se nesse seu service voce quer retornar um valor inteiro , em teoria, basta apenas trocar a assinatura de retorno do seu método. Voce remove o ?Collection e põe Int.