【问题标题】:Getting a raw SQL query with variables in Yii1在 Yii1 中获取带有变量的原始 SQL 查询
【发布时间】:2018-02-14 18:06:55
【问题描述】:

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

我尝试使用CDbExpressionCommandBuilder 构建基于几个子查询的复杂查询。结果我得到了这个:

SELECT * FROM `news` `t` WHERE id IN (:ycp0, :ycp1, :ycp2, :ycp3, :ycp4) LIMIT 5

标准内容的转储:

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
      )
    )

    ...

  )
)

我期望编译后的查询字符串是这样的:

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

这就是我在代码中所做的

$criteria = new CDbCriteria( ... );
$sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();
$queries[] = new CDbExpression($sql, $criteria->params);

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

$criteria = new CDbCriteria( ... );
$criteria->addInCondition('id', $queries);

最后,我尝试将结果作为 SQL 查询获得

$sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();

【问题讨论】:

标签: mysql yii yii1.x


【解决方案1】:

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

    '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

【讨论】:

【解决方案2】:

我认为你想做这样的事情: $criteria = ...; $command = $builder->createFindCommand($schema->getTable('name_of_table'), $criteria); $results = $command->text;

【讨论】:

    【解决方案3】:

    你得到带有参数的 SQL,就像你一样

    $sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();
    

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

    $params = array_map(function($param) { return '"' . $param . '"'; }, $criteria->params);
    

    最后,替换对:

    echo strtr($sql, $params);
    

    【讨论】:

      【解决方案4】:

      几乎没有其他选项可以执行相同的操作,但我会建议您 应该使用以下

      $results = MyModel::model()->findAllBySql("...");
      

      或者您可以选择以下内容: Sub-queries ActiveRecord Yii

      【讨论】:

      • 好吧,我不想用这种方法,因为它需要在模型中写很多SQL文本,而且看起来很糟糕。我喜欢使用 PDO。
      猜你喜欢
      • 2016-10-03
      • 2010-12-03
      • 2020-11-03
      • 2013-10-31
      • 1970-01-01
      • 2016-09-14
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多