web-dev-qa-db-ja.com

Yii2で生のSQLクエリを実行していますか?

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はtime()に従って計算する6か月の期間です。また、_balance_return_はユーザーが獲得したすべての勝利であるため、その合計がランキングを決定することに注意してください。

2番目のクエリは次のとおりです。

_$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
");
_
31
Lenny Carmi

このように生の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(プレースホルダーを含む)で、2番目の部分はプレースホルダーで使用される値の配列です。

73
jagsler