Как делать сложные или вложенные запросы с помощью QB?
Добавлено: 2019.10.03, 02:25
Всем привет!
Делаю радел статистики. Статистика динамическая, из таблиц базы данных MYSQL.
На Active Record, с использованием связей, такие запросы я знаю как сделать. Так как эти связи нужны только для этой статистики, то не хотелось бы захламлять доменную сущность не нужными ей связями. Отсюда возник вопрос как отказаться вообще от AR и построить такой запрос на Query Builder?
Вот пример запроса с использованием AR:
Понимаю, что начало запроса нужно заменить как-то так:
А вот как мне быть с joinWith()? Как мне сформировать данные в виде массива, при том у связей есть всегда условия...
Благодарю за помощь!
Делаю радел статистики. Статистика динамическая, из таблиц базы данных MYSQL.
На Active Record, с использованием связей, такие запросы я знаю как сделать. Так как эти связи нужны только для этой статистики, то не хотелось бы захламлять доменную сущность не нужными ей связями. Отсюда возник вопрос как отказаться вообще от AR и построить такой запрос на Query Builder?
Вот пример запроса с использованием AR:
Код: Выделить всё
$query = Certification::find()
->alias('c')
->select([
'c.id',
'c.user_id',
'c.category_id',
'TRIM(CONCAT_WS(\' \', p.last_name, p.name)) as user_name',
'COUNT(DISTINCT appointment.event_id) as appointment_count',
'category.name as categoryName'
])
->joinWith([
'profile as p' => function (ActiveQuery $query) {
$query->select(['p.user_id']);
},
'appointments' => function (AppointmentQuery $query) {
$query->appointed();
},
'category' => function (ActiveQuery $query) {
$query->select(['category.id', 'category.name']);
},
])
->andWhere(['category.role' => Certification::ROLE_JUDGE])
->andWhere('FROM_UNIXTIME(appointment.from_at, \'%Y\') = :year', [':year' => $year])
->active(true)
->valid(true)
->addGroupBy('appointment.user_id')
->addOrderBy('categoryName DESC')
->limit($limit && 0 < $limit && $limit < 1000 ? $limit : 1000)
->asArray();
Код: Выделить всё
(new Query())->from('certification') ....
Благодарю за помощь!