Laravel Count и Group By Child Relationship

У меня есть две таблицы: одна называется 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();
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
1 132
1

Ответы 1

При использовании агрегатов, таких как 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'];

Большое спасибо, это сработало отлично. Есть ли предложения по получению данных, чтобы у меня было множество компаний, а затем в каждой компании учитываются как горячие, так и холодные?

Karl 02.08.2018 22:24

Спасибо за обновление ответа, возможно ли что-то подобное? (Это не работает в банкомате) 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.

Karl 02.08.2018 23:09

На самом деле я нашел способ сделать это в laravel с помощью withCount, у меня есть отношения на модели для лидов, а затем я установил другие отношения для холодных, теплых и т. д.

Karl 02.08.2018 23:18

Другие вопросы по теме