使用Yii1

时间:2018-02-14 18:06:55

标签: mysql yii yii1.x

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

4 个答案:

答案 0 :(得分:0)

除了我建议你,还有其他选择可以执行同样的事情 应该使用以下

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

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

答案 1 :(得分:0)

您可以在db config(boolean)中使用enableParamLogging。您可以将其设置为有条件使用 - 确保不在生产中使用它。

'class'=>'CWebLogRoute'

如果您想在浏览器中查看所有输出,则可以将log添加到<span v-if="name"> Hi there, {{ name }} </span> 路由中。 docs

答案 2 :(得分:0)

我认为您想执行以下操作: $criteria = ...; $command = $builder->createFindCommand($schema->getTable('name_of_table'), $criteria); $results = $command->text;

答案 3 :(得分:0)

您将获得带有参数的SQL

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

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

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

最后,替换对:

echo strtr($sql, $params);