Выполнение необработанных SQL-запросов в Yii2?

Я написал следующие запросы, когда переношу свой PHP-сайт на платформу Yii2. Я хочу добавить их в свой контроллер, чтобы отображать 10 выигранных ставок. Я пробовал пройти через многие классы базы данных Yii2, но не могу заставить его работать.

Мои таблицы:

пользователи:

id | user_name | user_status | ...other columns...

ставки:

id | user_id | date_time |...other columns...| balance_return

Запросы, которые я хочу получить в Yii2:

$query_all = $dbh->query("
    SELECT SUM(bets.balance_return) AS total_win
         , bets.user_id
         , users.user_name
         , users.user_status
      FROM bets INNER JOIN users ON bets.user_id = users.id
     WHERE users.user_status = 'verified'
       AND bets.date_time > " . $start_date . "
  GROUP BY bets.user_id
  ORDER BY total_win DESC
");

Переменная start_date — это период в 6 месяцев, который я рассчитываю в соответствии с time(). Также обратите внимание, что balance_return — это каждый выигрыш, полученный пользователем, поэтому его сумма определяет рейтинг.

Второй запрос:

$qwi = $dbh->query("
    SELECT SUM(bets.balance_return) AS total_win
         , bets.user_id
         , users.user_name
         , users.user_status
      FROM bets INNER JOIN users ON bets.user_id = users.id
     WHERE users.user_status = 'verified'
       AND bets.date_time > " . $start_date . "
  GROUP BY bets.user_id
  ORDER BY total_win DESC LIMIT 0,10
");

person Lenny Carmi    schedule 06.05.2015    source источник


Ответы (1)


Вы можете выполнить необработанный sql следующим образом

$connection = Yii::$app->getDb();
$command = $connection->createCommand("
    SELECT SUM(bets.balance_return) AS total_win
     , bets.user_id
     , users.user_name
     , users.user_status
    FROM bets INNER JOIN users ON bets.user_id = users.id
    WHERE users.user_status = 'verified'
    AND bets.date_time > :start_date
    GROUP BY bets.user_id
    ORDER BY total_win DESC", [':start_date' => '1970-01-01']);

$result = $command->queryAll();

Я рекомендую прочитать: http://www.yiiframework.com/doc-2.0/yii-db-connection.html#createCommand()-detail

Первый параметр — это sql (с заполнителями), а вторая часть — это массив значений, которые будут использоваться с заполнителями.

person Jap Mul    schedule 07.05.2015
comment
Большое спасибо за ответ на вопрос. Мне удалось заставить его работать после двухдневного застревания. Так же хотел отметить, что при вызове $connection = Yii::$app->getDb(); из контроллера модуля получаю ошибку, пришлось вызывать $connection = \Yii::$app->getDb(); К чему бы это? - person Lenny Carmi; 08.05.2015
comment
Ошибка была из-за пространства имен. Если вы хотите использовать Yii без косой черты, вам нужно добавить use Yii; в начало класса. - person Jap Mul; 09.05.2015
comment
В качестве лучшей практики я использую привычку делать \Yii::$app... везде, где я использую встроенный объект Yii. - person David J Eddy; 19.05.2016