2015-05-06 71 views
25

當我將我的PHP網站遷移到Yii2框架時,我寫了下面的查詢。我想將它們添加到我的控制器中,以顯示贏得的前10個賭注。我嘗試過很多Yii2數據庫類,但是我無法實現它。在Yii2中執行原始SQL查詢?

我的表是:

用戶:

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是每贏一個用戶所以它的總和決定了排名。

第二個查詢是:

$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 
"); 

回答

51

您可以執行原始的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(用佔位符(S )),第二部分是與佔位符一起使用的值數組。

+0

非常感謝你回答這個問題。我在卡住了兩天之後才設法讓它工作。另外我想說明的是,當我從模塊控制器調用'$ connection = Yii :: $ app-> getDb();'時,我收到一個錯誤,我不得不調用'$ connection = \ Yii :: $ app-> getDb();'爲什麼會這樣? –

+2

錯誤是由於命名空間。如果你想在沒有斜槓的情況下使用'Yii',你必須在類的頂部添加'use Yii;'。 – jagsler

+0

作爲一種最佳實踐,我習慣於在Yii對象內嵌的任何位置使用'''Yii :: $ app ...''''。 –