【问题标题】:How to convert SelectQuery object to SQL string?如何将 SelectQuery 对象转换为 SQL 字符串?
【发布时间】:2012-12-05 01:22:42
【问题描述】:

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

我检查了这个对象的documentation,也查看了谷歌,但找不到有效的答案。

【问题讨论】:

  • 如果是准备好的SQL语句,那么就没有“编译”版本的查询,都是由数据库服务器内部处理的。 Related question on prepared statements
  • 有什么方法可以在 phpmyadmin 中手动执行它?还是只能使用准备、设置和执行命令来实现?
  • 您基本上需要找到一种方法来模拟存储过程的工作方式,方法是使用您的查询参数并相应地替换语句中的占位符。 This looked useful 但并不完全是您需要的 drupal 解决方案,只是概念。

标签: php sql drupal drupal-7


【解决方案1】:

基于问题的 cmets(感谢 @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 函数或将返回的对象转换为@ 987654329@.

另外,这可能不是我能写的最佳解决方案,但假设时间和目的有限,它很好地解决了我的问题。

【讨论】:

    【解决方案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();
      }
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-03
      • 2018-07-19
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多