1

__toString() マジック メソッドを使用して文字列を出力できましたが、この文字列にはプレースホルダー (条件パラメーター用) が表示され、SQL クエリとしては機能しません。

このオブジェクトのドキュメントを確認し、Google も調べましたが、有効な答えが見つかりませんでした。

4

2 に答える 2

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));

元のオブジェクトを拡張して、SQL コードを取得するメソッドを提供しようと考えてSelectQueryいましたが、Drupal のdb_select関数は を返すSelectQueryため、関数を変更db_selectするか、返されたオブジェクトを にキャストする必要がありますExportableSelectQuery

また、これはおそらく私が書くことができる最善の解決策ではありませんが、時間と目的の制限を想定すると、問題はうまく解決しました。

于 2012-12-05T04:33:35.240 に答える
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();
    }
    

カルロスのコメントに基づく解決策

于 2014-04-22T11:18:01.757 に答える