Yii1 是否有任何本地方法来获取带有内置变量的原始 SQL?
我尝试使用
CDbExpression
和 CommandBuilder
构建基于几个子查询的复杂查询。我得到的结果是:
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();
您将获得带有参数的 SQL
$sql = $this->commandBuilder->createFindCommand($tableName, $criteria)->getText();
然后获取用引号括起来的参数:
$params = array_map(function($param) { return '"' . $param . '"'; }, $criteria->params);
最后,更换对:
echo strtr($sql, $params);
您可以在数据库配置中使用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
路线中。 文档
我想你想做这样的事情:
$criteria = ...;
$command = $builder->createFindCommand($schema->getTable('name_of_table'), $criteria);
$results = $command->text;
执行相同操作的其他选项很少,但我会建议您 应该使用以下
$results = MyModel::model()->findAllBySql("...");
或者您可以选择以下内容: 子查询 ActiveRecord Yii