it-swarm.com.de

Debuggen von EntityFieldQuery?

Ich habe ein Modul, das sich schlecht benimmt. Ein EFQ speichert unerwartete Ergebnisse, aber ich kann nicht sehen warum , indem ich nur den Code betrachte. Gibt es ein dpq () Äquivalent für EFQs? Andere Möglichkeiten, sie zu debuggen?

26
Letharion

Es ist ein kleiner Hack, aber Sie können jedem EntityFieldQuery, für das Sie die Abfrage drucken möchten, ein Tag hinzufügen und dann hook_query_alter() implementieren, um abzufangen Wenn es sich um ein Standard-SelectQuery handelt, wandeln Sie es zum Debuggen in einen String um:

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

Es ist ein bisschen wie ein Hack, macht aber den Trick. Die Ausgabe für das Obige ist:

SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type     
AS entity_type
FROM {node} node

Vermutlich funktioniert dies auch nur bei Verwendung von MySQL als Feldspeichersystem.

36
Clive

Anstatt Ihren eigenen hook_query_alter () zu rollen, können Sie das Modul Devel das schwere Heben für Sie erledigen lassen, indem Sie das Tag debug hinzufügen:

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

Dadurch wird die Abfrage auf dem Bildschirm gedruckt, genau wie bei dpq().

13
Dalin

Hinzufügen zur @ Clive-Antwort, bei der die Abfrage im Allgemeinen mit dem Platzhalter und nicht mit dem Wert gedruckt wird. Um den Wert mit der Abfrage zu drucken, verwenden Sie den folgenden Code unter 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();

Es wird nicht empfohlen, ein Modul für die wenigen Codezeilen zu installieren. Deshalb habe ich mich für die oben genannte Lösung entschieden.

4

Wenn Sie die Entwicklungsversion von Nice DPQ (oder irgendetwas => 1.1) herunterladen, können Sie einfach Folgendes tun:

$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();

und du wirst die Abfrage dpm'ed schön bekommen :). Der wichtige Teil im obigen Code ist addTag ('nicedpq') - der die dpm() auslöst.

2
mojzis

Sie können versuchen, es über XDebug zu debuggen. Nach der Installation führen Sie xdebug_start_trace() vor dem Code und xdebug_stop_trace() danach aus. Dann haben Sie ein klares Ablaufverfolgungsprotokoll, was wo ausgeführt wurde.

Sie können den Abfrageprotokollierer auch in der MySQL-Konfiguration aktivieren.

Die andere Methode besteht darin, strace/truss/dtruss wie Debugger zu verwenden.

Beispiel mit dtruss:

  • alle Anfragen

    Sudo dtruss -t read -n mysqld
    
  • spezifische Fragen

    Sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
    

Beachten Sie, dass dtruss nur ein Skript ist, das DTrace verwendet. Sie können daher eine direkte Implementierung von statische PHP DTrace-Tests oder DTracing MySQL in Betracht ziehen, indem Sie Ihr eigenes Skript schreiben .

Lesen Sie mehr: Erweitertes Debuggen von Drupal Core über die Befehlszeile (strace & tcpdump)

1
kenorb

Fügen Sie diese Funktion Ihrem Modul hinzu. Fügen Sie dann das Tag debug zu einem beliebigen EFQ hinzu. Erfordert, dass das Entwicklungsmodul aktiviert ist, um die Abfrage zu drucken.

/**
 * 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