web-dev-qa-db-ja.com

EntityFieldQueryをデバッグしますか?

正しく動作しないモジュールがあります。 EFQは予期しない結果を再試行していますが、コードを見ただけではなぜかわかりません。 dpq() EFQに相当するものはありますか?それらをデバッグする他の方法は?

26
Letharion

これはちょっとしたハックですが、クエリを出力したい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を使用している場合にのみ機能します。

36
Clive

独自のhook_query_alter()をロールするのではなく、debugタグを追加することで Devel モジュールに負荷をかけさせることができます。

_$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
  ->addTag('debug')
  ->execute();
_

これは、dpq()と同様に、クエリを画面に出力します。

13
Dalin

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

数行のコードのモジュールをインストールすることはお勧めできません。だから私は前述の解決策を選びました。

4

開発版の 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()がトリガーされます。

2
mojzis

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 の直接実装を検討できます。 。

続きを読む: Drupalコマンドラインを使用したコアのデバッグ(strace&tcpdump)

1
kenorb

この関数をモジュールに追加します。次に、タグ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);
  }
}
0
KeyboardCowboy