Как считать и группировать в yii2

Я хотел бы сгенерировать следующий запрос с помощью yii2:

SELECT COUNT(*) AS cnt FROM lead WHERE approved = 1 GROUP BY promoter_location_id, lead_type_id

Я пробовал:

$leadsCount = Lead::find()
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();

Что генерирует этот запрос:

SELECT COUNT(*) FROM (SELECT * FROM `lead` WHERE approved = 1 GROUP BY `promoter_location_id`, `lead_type_id`) `c`

В yii 1.x я бы сделал следующее:

$criteria = new CDbCriteria();
$criteria->select = 'COUNT(*) AS cnt';
$criteria->group = array('promoter_location_id', 'lead_type_id');

Спасибо!

Ответы

Ответ 1

Решение:

$leadsCount = Lead::find()
->select(['COUNT(*) AS cnt'])
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->all();

и добавьте public $cnt к модели, в моем случае Lead.

Как сказал Kshitiz, вы также можете просто использовать yii\db\Query::createCommand().

Ответ 2

Вы можете получить счет, используя count() в списке "Запрос"

$leadCount = Lead::find()
->where(['approved'=>'1'])
->groupBy(['promoter_location_id', 'lead_type_id'])
->count();

Ссылка Ссылка для различных функций select query

Ответ 3

Если вас просто интересует счет, используйте yii\db\Query, как упоминалось другими. Не требуется никаких изменений в вашей модели:

$leadsCount = (new yii\db\Query())
    ->from('lead')
    ->where('approved = 1')
    ->groupBy(['promoter_location_id', 'lead_type_id'])
    ->count();

Здесь ссылка на Документацию API Yii2

Ответ 4

Без добавления свойства $cnt к модели

$leadsCount = Lead::find()
->select(['promoter_location_id', 'lead_type_id','COUNT(*) AS cnt'])
->where('approved = 1')
->groupBy(['promoter_location_id', 'lead_type_id'])
->createCommand()->queryAll();