【问题标题】:Performing raw SQL queries in Yii2?在 Yii2 中执行原始 SQL 查询?
【发布时间】:2015-07-16 21:07:54
【问题描述】:

我在将 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
");

【问题讨论】:

    标签: php mysql yii2 yii2-advanced-app


    【解决方案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(带有占位符),第二部分是要与占位符一起使用的值数组。

    【讨论】:

    • 非常感谢您回答这个问题。在卡住了两天后,我设法让它工作。我还想指出,当我从模块控制器调用$connection = Yii::$app->getDb(); 时收到错误消息,我必须调用$connection = \Yii::$app->getDb(); 为什么会这样?
    • 错误是因为命名空间。如果你想使用不带斜线的Yii,你必须在类的顶部添加use Yii;
    • 作为最佳实践,我养成了在任何我使用内联 Yii 对象的任何地方执行 \Yii::$app... 的习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2016-02-21
    • 2018-09-08
    相关资源
    最近更新 更多