如何将SelectQuery对象转换为SQL字符串?

时间:2012-12-05 01:22:42

标签: php sql drupal drupal-7

我设法使用__toString()魔术方法打印一个字符串,但在这个字符串中我看到占位符(对于条件参数),它不能用作SQL查询。

我检查了此对象的documentation,并查看了Google,但找不到合适的答案。

2 个答案:

答案 0 :(得分:2)

基于问题的评论(感谢@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

这也不是我写的最好的解决方案,但假设时间和目的有限,它解决了我的问题就好了。

答案 1 :(得分:0)

如果你想从例如“EntityFieldQyery”获取SQL,你可以使用这样的东西

  1. 为查询添加标记

    $query->entityCondition('entity_type', 'node')
          ->entityCondition('bundle', 'page')
          ->addTag('EFQDumper'); //<=== TAG
    
  2. 实现钩子“query_TAG_alter”

    function YOURMODULE_query_EFQDumper_alter(QueryAlterableInterface $query)
    {
     //echo ExportableSelectQuery::toSql($query);
     //die();
    }
    
  3. 基于卡洛斯评论的解决方案