我设法使用 __toString() 魔术方法打印了一个字符串,但在这个字符串中我看到了占位符(用于条件参数),它不能用作 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();
}
基于卡洛斯评论的解决方案