У меня есть две таблицы: одна называется companies, а другая - leads. Используя Eloquent в Laravel, я хотел бы подсчитать количество потенциальных клиентов для каждой компании. Это довольно просто, но мне также нужно сгруппировать их по статусу потенциальных клиентов.
например
Компания А имеет
3 hot leads
2 cold leads
Компания B имеет
6 cold leads
0 hot leads
Таблица Companies имеет следующую структуру:
id
name
Таблица Leads имеет следующую структуру
id
company_id
status (hot, cold)
Я пробовал следующее, которое позволяет подсчитать количество потенциальных клиентов для каждой компании, но это необходимо дополнительно сгруппировать по статусу потенциальных клиентов.
DB::table('companies')
->selectRaw('companies.id, companies.name, COUNT(*) as count')
->join('leads', 'leads.company_id', '=', 'companies.id')
->groupBy('id')
->get();






При использовании агрегатов, таких как count, необходимо обеспечить группировку по всем выбранным неагрегированным столбцам.
MySQL обычно позволяет вам этого не делать, но результаты запроса могут оказаться бессмысленными.
$companies = DB::table('companies')
->select(['companies.name', 'leads.status', \DB::raw('COUNT(*) as count')])
->join('leads', 'leads.company_id', '=', 'companies.id')
->groupBy('companies.name', 'leads.status')
->get();
Если у вас есть несколько записей в таблице компаний с одним и тем же именем (но с разными идентификаторами), это сгруппирует все счетчики вместе для каждого повторяющегося названия компании. В этом случае вы также должны выбрать и сгруппировать по companies.id.
Если вы хотите ввести это по компании, а затем по статусу, следующее должно работать ...
$companies = $companies->groupBy('name')->map(function ($company) {
return $company->groupBy('status')->map(function ($company) {
return $company->first()['count'];
});
});
Тогда вы можете использовать это как ...
echo $companies['testCompanyName']['hot'];
echo $companies['testCompanyName']['cold'];
Спасибо за обновление ответа, возможно ли что-то подобное? (Это не работает в банкомате) select *, (select count(*) from компании внутреннее соединение leads на leads.company_id = companies.id, где leads.status = 'холодный') как cold_count, (выберите счетчик () из внутреннего соединения companiesleads на leads.company_id = companies.id, где leads.status = 'теплый') как warm_count, (выберите count () из внутреннего соединения companiesleads на leads.company_id = companies .id, где leads.status = 'hot') как hot_count из companies, где companies.deleted_at имеет значение null.
На самом деле я нашел способ сделать это в laravel с помощью withCount, у меня есть отношения на модели для лидов, а затем я установил другие отношения для холодных, теплых и т. д.
Большое спасибо, это сработало отлично. Есть ли предложения по получению данных, чтобы у меня было множество компаний, а затем в каждой компании учитываются как горячие, так и холодные?