__toString() マジック メソッドを使用して文字列を出力できましたが、この文字列にはプレースホルダー (条件パラメーター用) が表示され、SQL クエリとしては機能しません。
このオブジェクトのドキュメントを確認し、Google も調べましたが、有効な答えが見つかりませんでした。
__toString() マジック メソッドを使用して文字列を出力できましたが、この文字列にはプレースホルダー (条件パラメーター用) が表示され、SQL クエリとしては機能しません。
このオブジェクトのドキュメントを確認し、Google も調べましたが、有効な答えが見つかりませんでした。
質問のコメントに基づいて (インスピレーションをくれた @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
。
また、これはおそらく私が書くことができる最善の解決策ではありませんが、時間と目的の制限を想定すると、問題はうまく解決しました。
たとえば「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();
}
カルロスのコメントに基づく解決策