正しく動作しないモジュールがあります。 EFQは予期しない結果を再試行していますが、コードを見ただけではなぜかわかりません。 dpq() EFQに相当するものはありますか?それらをデバッグする他の方法は?
これはちょっとしたハックですが、クエリを出力したいEntityFieldQuery
にタグを追加し、次に hook_query_alter()
を実装してインターセプトすることができます標準のSelectQuery
の場合は、デバッグのために文字列にキャストします。
function MYMODULE_query_alter($query) {
if ($query->hasTag('efq_debug')) {
dpm((string)$query);
}
}
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node')
->addTag('efq_debug')
->execute();
それは少しハックですが、トリックを行います。上記の出力は次のとおりです。
SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type
AS entity_type
FROM {node} node
おそらく、これはフィールドストレージシステムとしてMySQLを使用している場合にのみ機能します。
独自のhook_query_alter()をロールするのではなく、debug
タグを追加することで Devel モジュールに負荷をかけさせることができます。
_$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug')
->execute();
_
これは、dpq()
と同様に、クエリを画面に出力します。
@Clive回答に追加します。これは通常、値とともにではなく、プレースホルダーとともにクエリを出力します。クエリで値を出力するには、hook_query_alterの下で次のコードを使用します。
function hook_query_alter($query) {
if ($query->hasTag('debug')) {
$sql = (string)$query;
$connection = Database::getConnection();
foreach ((array) $query->arguments() as $key => $val) {
$quoted[$key] = $connection->quote($val);
}
$sql = strtr($sql, $quoted);
dpm($sql);
}
}
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug');
->execute();
数行のコードのモジュールをインストールすることはお勧めできません。だから私は前述の解決策を選びました。
開発版の Nice DPQ (または何か=> 1.1)をダウンロードすると、次のように簡単に実行できます。
_$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();
_
クエリがうまくdpmされます:)。上記のコードの重要な部分はaddTag( 'nicedpq')で、これによりdpm()
がトリガーされます。
XDebug でデバッグしてみることができます。インストールしたら、コードの前にxdebug_start_trace()
を実行し、その後にxdebug_stop_trace()
を実行すると、実行内容と実行場所が明確なトレースログになります。
また、MySQL構成でクエリロガーを有効にすることができます。
もう1つの方法は、デバッガーのようにstrace/truss/dtrussを使用することです。
Dtrussの使用例:
すべてのクエリ
Sudo dtruss -t read -n mysqld
特定のクエリ
Sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
dtruss
はDTraceを使用するスクリプトにすぎないため、独自のスクリプトを作成して PHP DTrace static probe または DTracing MySQL の直接実装を検討できます。 。
この関数をモジュールに追加します。次に、タグdebug
を任意のEFQに追加します。クエリを印刷するには、Develモジュールを有効にする必要があります。
/**
* Implements hook_query_TAG_alter().
*
* Add the tag 'debug' to any EFQ and this will print the query to the messages.
*
* @param \QueryAlterableInterface $query
*/
function MYMODULE_query_debug_alter(QueryAlterableInterface $query) {
if (function_exists('dpq') && !$query->hasTag('debug-semaphore')) {
$query->addTag('debug-semaphore');
dpq($query);
}
}