@akula22

Много OR и AND в запросе ActiveRecord?

В таблице matches есть поля user1, user2, score1, score2 и tour_id
сюда записываются игры.

юзер может быть и user1 и user2 в зависимости от того где игра, дома или в гостях

мне надо получить общий счет юзера 1 и общий счет юзера 2 нужного турнира, чтобы сравнить и определить кто победил.

придумал вот такой запрос
$score1 = Matches::find()->asArray()->where(['tour_id' => $matche->tour_id, 'part' => $part])->andWhere(['user1' => $matche->user1, 'user2' => $matche->user2])->orWhere(['user1' => $matche->user2, 'user2' => $matche->user1])->sum('score1');


вроде как получаю счет игрока 1, но мне надо получить и второй счет и не уверен что правильно составил запрос, помогите с запросом? может можно все сделать одним запросом?
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
padlyuck
@padlyuck
как-то так
$scores = Matches::find()
->asArray()
->where(['tour_id' => $matche->tour_id, 'part' => $part])
->andWhere(['user1' => $matche->user1, 'user2' => $matche->user2])
->orWhere(['user1' => $matche->user2, 'user2' => $matche->user1])
->select([new Expression('sum(score1) sum_score1'),new Expression('sum(score2) sum_score2')])
->one();

хотя лучше для этой цели взять просто QueryBuilder, а не AR
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
В sum можно передать yii\db\Expression
Не пробовал, но по идее можно так:
$exp= new yii\db\Expression('SUM(score1) as score1, SUM(score2) as score2');
$score1 = Matches::find()->sum($exp);
Ответ написан
Комментировать
@akula22 Автор вопроса
Подскажите как еще взять из таблицы данные, где значение part максимальное?
что-то типа этого
$part = TourPlayoff::find()
            ->where(['tour_id' => $this->tour_id, 'user_id' => [$model->user1, $model->user2]])
            ->asArray()
            ->select([new Expression('max(part) part'), new Expression('team_id')])
            ->all();

выводит только одну запись, а их две!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы