it-swarm.com.ru

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

Спасибо!

17
deacs

Решение:

$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().

22
deacs

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

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

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

8
Kailas

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

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

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

7
Harman Dhillon

Без добавления свойства $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();
0
t6nnp6nn

Просто обратите внимание, на случай, если кому-то поможет, что метод получения, используемый как свойство, является счетным (тогда как при вызове как функции он вернет 1). В этом примере у меня есть класс Category с листингами, к которым присоединился перечисление list_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)

Счетчик вызовов для функции вернет 1:

count($oCat->getListingsApprovedActive())
0
Rich Harding