2015-05-06 77 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 ...''''。 –