如何SelectQuery对象转换为SQL字符串?(How to convert SelectQue

2019-10-17 11:08发布

我设法打印使用__toString()魔术方法的字符串,但在这个字符串我看到占位符(用于条件PARAMS),并且它不作为SQL查询工作。

我查了一下资料这个对象,并且还看着谷歌,但一直没找到工作的答案。

Answer 1:

立足于问题的意见(感谢@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

另外这是不是可能是最好的解决办法,我可以写,但时间和目的,解决我的问题就好了假设的限制。



Answer 2:

如果您希望从例如“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(); } 

基于卡洛斯评论的解决方案



文章来源: How to convert SelectQuery object to SQL string?