我设法打印使用__toString()魔术方法的字符串,但在这个字符串我看到占位符(用于条件PARAMS),并且它不作为SQL查询工作。
我查了一下资料这个对象,并且还看着谷歌,但一直没找到工作的答案。
我设法打印使用__toString()魔术方法的字符串,但在这个字符串我看到占位符(用于条件PARAMS),并且它不作为SQL查询工作。
我查了一下资料这个对象,并且还看着谷歌,但一直没找到工作的答案。
立足于问题的意见(感谢@Scuzzy灵感)我写了一些简单的代码转换SelectQuery
对象:
class ExportableSelectQuery {
public static function toSql(SelectQuery $obj) {
$_string = $obj->__toString();
$_conditions = $obj->conditions();
$_tables = $obj->getTables();
$_fields = $obj->getFields();
foreach($_tables as $k => $t) {
if(!empty($t['alias'])) {
$_string = str_replace('{' . $t['table'] . '}', $t['table'] . ' as', $_string);
}
else {
$_string = str_replace('{' . $t['table'] . '}', $t['table'], $_string);
}
}
foreach($_conditions as $k => $c) {
if(is_int($c['value'])) {
$_string = str_replace(':db_condition_placeholder_' . $k, $c['value'], $_string);
}
else {
$_string = str_replace(':db_condition_placeholder_' . $k, "'" . $c['value'] . "'", $_string);
}
}
//echo('<pre>');
//var_dump($_fields);
//var_dump($_conditions);
//var_dump($_tables);
//var_dump($_string);
//echo('</pre>');
//die();
return $_string;
}
}
这段代码的使用现在简单(如果你只有SelectQuery
对象的地方):
die(ExportableSelectQuery::toSql($query));
我在想扩大原有SelectQuery
对象,并提供方法来获得SQL代码,但是Drupal的db_select
函数返回SelectQuery
,所以我将不得不要么改变db_select
功能或铸返回对象ExportableSelectQuery
。
另外这是不是可能是最好的解决办法,我可以写,但时间和目的,解决我的问题就好了假设的限制。
如果您希望从例如“EntityFieldQyery”获得SQL,你可以使用这样的事情
添加标签来查询
$query->entityCondition('entity_type', 'node') ->entityCondition('bundle', 'page') ->addTag('EFQDumper'); //<=== TAG
实行挂钩“query_TAG_alter”
function YOURMODULE_query_EFQDumper_alter(QueryAlterableInterface $query) { //echo ExportableSelectQuery::toSql($query); //die(); }
基于卡洛斯评论的解决方案