首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Yii1中的变量获取原始SQL查询

使用Yii1中的变量获取原始SQL查询
EN

Stack Overflow用户
提问于 2018-02-15 02:06:55
回答 4查看 3.2K关注 0票数 1

Yii1是否有任何原生方法来获取构建了变量的原始SQL?

我尝试使用CDbExpressionCommandBuilder在一些子查询的基础上构建一个复杂查询。我得到的结果是:

代码语言:javascript
运行
复制
SELECT * FROM `news` `t` WHERE id IN (:ycp0, :ycp1, :ycp2, :ycp3, :ycp4) LIMIT 5

条件内容的转储:

代码语言:javascript
运行
复制
CDbCriteria Object (
  [select] => *
  [condition] => id IN (:ycp0, :ycp1, :ycp2, :ycp3, :ycp4)

  ...

  [params] => Array(
    [:ycp0] => CDbExpression Object(
      [expression] => SELECT id FROM `news` `t` WHERE (rubric=:rb1) AND (:im2 & `im`=:im2) LIMIT 1
      [params] => Array(
        [:rb1] => 1
        [:im2] => 2
      )
    )

    ...

  )
)

我预计编译后的查询字符串如下:

代码语言:javascript
运行
复制
SELECT * FROM .. WHERE id IN(
    (SELECT id FROM .. WHERE .. ORDER BY .. LIMIT 1),
    (SELECT id FROM .. WHERE .. ORDER BY .. LIMIT 1)
) ORDER BY .. LIMIT 5

这就是我在代码中做的事情

代码语言:javascript
运行
复制
$criteria = new CDbCriteria( ... );
$sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();
$queries[] = new CDbExpression($sql, $criteria->params);

然后,我尝试将子查询组合为一个复杂的查询

代码语言:javascript
运行
复制
$criteria = new CDbCriteria( ... );
$criteria->addInCondition('id', $queries);

最后,我尝试以SQL-query的形式获得结果

代码语言:javascript
运行
复制
$sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();
EN

回答 4

Stack Overflow用户

发布于 2018-02-15 08:53:45

您可以在数据库配置中使用enableParamLogging (布尔值)。您可以对其进行设置,以便有条件地使用它--确保不在生产中使用它。

代码语言:javascript
运行
复制
    'db' => [
        'connectionString' => 'mysql:host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname,
        'emulatePrepare' => true,
        'username' => $db_user,
        'password' => $db_pass,
        'schemaCachingDuration' => 3600,
        'charset' => 'utf8',
        'enableProfiling' => $db_profile,
        'enableParamLogging' => $db_params,
    ],

然后,如果希望在浏览器中查看所有输出,则可以将'class'=>'CWebLogRoute'添加到log路由。docs

票数 0
EN

Stack Overflow用户

发布于 2019-08-13 23:06:48

我认为您应该这样做:$criteria = ...; $command = $builder->createFindCommand($schema->getTable('name_of_table'), $criteria); $results = $command->text;

票数 0
EN

Stack Overflow用户

发布于 2020-10-06 13:31:14

您将获得带有params的SQL,如下所示

代码语言:javascript
运行
复制
$sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();

然后获取用引号括起来的参数:

代码语言:javascript
运行
复制
$params = array_map(function($param) { return '"' . $param . '"'; }, $criteria->params);

最后,替换成对的:

代码语言:javascript
运行
复制
echo strtr($sql, $params);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48793621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档