Laravel Вывести количество и связанных моделей по статусам
Есть таблицы:
statuses (id, name) - справочник
compamies (id, name)
jobs (id, company_id)
job_requests (id, job_id, status_id)
Нужно подсчитать и вывести количество job_requests по статусам. Достаточно id статуса, имя статуса, и его количество в job_requests
Каким вариантом это можно и лучше реализовать, и главное как?
Есть связь на уровне модели
$company->jobRequests()Либо через DB fasade
$jobRequestsBuilder = DB::table('job_requests')->join('jobs', 'jobs.id', '=', 'job_requests.job_id')->where('jobs.company_id', '=', $company->id);
А нужно получить массив вида
[
["name" => "status_1", "count" => 10, "id" => status1Id],
["name" => "status_2", "count" => 2, "id" => status2Id]
["name" => "status_4", "count" => 4, "id" => status3Id]
]
Был такой вариант
$applicantsBuilder = DB::table('job_requests') ->join('jobs', 'jobs.id', '=', 'job_requests.job_id') ->where('jobs.company_id', '=', $company->id);
$statuses = Status::all();
foreach ($statuses as $status) {
$applicantsBuilder->selectRaw("count(case when status_id = " . $status->id . " then 1 end) as " . $status->name);
}
Но так, я получаю, только часть данных
{"pending":0,"approved":0,"rejected":0,"shortlisted":0,"reserved":0,"interviewed":0,"selected":0,"hired":0}
Как получить id не знаю
Ответы (1 шт):
Думаю через фасад DB так
$statuses = DB::table('job_requests')
->leftJoin('statuses', 'job_requests.status_id', '=', 'statuses.id')
->selectRaw('statuses.name AS name, count(*) as count, statuses.id AS id')
->groupBy('statuses.name')
->get();
если вариант выше свалиться в ошибку группировки то можно попробовать
->groupBy('statuses.name', 'statuses.id')