Как считать и группировать в 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');

Спасибо!


person deacs    schedule 24.06.2014    source источник
comment
вы можете использовать команду create для написания вашего запроса mysql   -  person Kshitiz    schedule 25.06.2014
comment
Пожалуйста, опубликуйте решение как ответ.   -  person Cthulhu    schedule 26.06.2014


Ответы (5)


Решение:

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

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

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

person deacs    schedule 27.06.2014
comment
Это работает, и мне пришлось добавить общедоступную переменную в класс модели, упомянутую @deacs, и заменить метод all() на ->createCommand()->queryAll();. Также обратите внимание, что мой метод select() имеет несколько ->select(['type, date(significant_timestamp) AS significant_timestamp, COUNT(*) AS size']) - person Gajen Sunthara; 05.09.2017

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

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

Справочная ссылка для различных функций запроса на выборку

person Kailas    schedule 26.05.2016

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

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

Вот ссылка на документацию по Yii2 API< /а>

person Harman Dhillon    schedule 11.06.2015

Без добавления свойства $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();
person t6nnp6nn    schedule 21.02.2017
comment
Пожалуйста, не просто публикуйте код, но также добавьте несколько слов, объясняющих, в чем заключается основное различие. - person mkl; 21.02.2017
comment
Но в итоге получаем не ActiveRecords - person Anton Rybalko; 16.06.2017
comment
Да. Этот запрос не вернет ActiveRecords, поскольку вы определяете -›select(['promoter_location_id', 'lead_type_id','COUNT(*) AS cnt']) - person t6nnp6nn; 08.07.2018

Просто примечание, если это кому-то поможет, что геттер, используемый в качестве свойства, является счетным (тогда как, если он вызывается как функция, он возвращает 1). В этом примере у меня есть класс Category со списками, объединенными listing_to_category. Чтобы получить активные одобренные списки для категории, я возвращаю ActiveQuery, таким образом:

/**
 * @return \yii\db\ActiveQuery
 */
public function getListingsApprovedActive() {
        return $this->hasMany(Listing::className(), ['listing_id' => 'listing_id'])
                                ->viaTable('listing_to_category', ['category_id' => 'category_id'])
                                ->andWhere(['active' => 1])->andWhere(['approved' => 1]);
}

Вызов счетчика для свойства категории вернет количество записей:

count($oCat->listingsApprovedActive)

Вызов count функции вернет 1:

count($oCat->getListingsApprovedActive())
person Rich Harding    schedule 25.10.2018