Debug EntityFieldQuery?


27

Ho un modulo che si comporta male. Un EFQ sta recuperando risultati inaspettati, ma non riesco a capire perché semplicemente guardando il codice. Esiste un equivalente dpq () per gli EFQ? Altri modi per eseguirne il debug?


Domanda simile: drupal.stackexchange.com/questions/33473/… . Puoi eseguire il cast dell'oggetto query in una stringa per esaminarlo per vedere se l'SQL fornisce qualche indizio?
Clive

1
Grandi suggerimenti, tuttavia: errore irreversibile irreversibile: l'oggetto della classe EntityFieldQuery non può essere convertito in stringa :(
Letharion

Risposte:


36

È un po 'un trucco, ma potresti aggiungere un tag a chiunque EntityFieldQuerytu sia interessato a stampare la query, quindi implementarlo hook_query_alter()per intercettarlo quando è uno standard SelectQuery, quindi lanciarlo su stringa per il debug:

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

È un po 'un trucco ma fa il trucco. L'output per quanto sopra è:

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

Presumibilmente questo funzionerà anche solo quando si utilizza MySQL come sistema di archiviazione sul campo.


Sembra grande in teoria, ma per quanto riguarda i commenti sulla domanda? EFQ non implementa __toString ()?
Letharion,

4
Quando arriva alla hook_query_alter()query non è più uno EntityFieldQuery, è stato convertito in uno standard db_select(), quindi __tostring()funziona benissimo :) Da quando ho lavorato, l'ho usato abbastanza e funziona abbastanza bene
Clive

Confermato che il casting su stringa funziona quando arriva la query hook_query_alter().
jhedstrom,

Per vedere la query argomento (": entity_type" nell'esempio sopra) puoi usare dpm ($ query-> argomenti ());
sanzante,

13

Invece di lanciare il tuo hook_query_alter () puoi lasciare che il modulo Devel faccia il lavoro pesante per te aggiungendo il debugtag:

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

Questo stamperà la query sullo schermo, proprio come dpq()farebbe.


4

Aggiungendo alla risposta @Clive, che generalmente stampa la query con il segnaposto non insieme al valore. Per stampare il valore con la query, utilizzare il seguente codice in 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();

Non è buona norma installare un modulo per le poche righe di codice. Ecco perché ho optato per la soluzione di cui sopra.


2

Se scarichi la versione di sviluppo di Nice DPQ (o qualcosa => 1.1), puoi semplicemente fare:

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

e otterrai la query dpm'ed bene :). La parte importante nel codice sopra è addTag ('nicedpq') - che attiva dpm().


bella soluzione alternativa da sviluppare. Non è stato possibile trovare quel modulo direttamente su DO perché hanno rimosso il relativo blocco modulo che era lì.
kiranking,

1

Puoi provare a eseguire il debug tramite XDebug . Una volta installato, esegui xdebug_start_trace()prima del codice e xdebug_stop_trace(), successivamente, avrai un chiaro registro di traccia di ciò che è stato eseguito e dove.

Inoltre è possibile abilitare il logger di query nella configurazione MySQL.

L'altro metodo consiste nell'utilizzare strace / truss / dtruss come debugger.

Esempio usando dtruss:

  • tutte le domande

    sudo dtruss -t read -n mysqld
  • query specifiche

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

Nota che dtrussè solo uno script che utilizza DTrace, quindi puoi prendere in considerazione un'implementazione diretta delle sonde statiche PHP DTrace o DTracing MySQL scrivendo il tuo script.

Per saperne di più: debug avanzato del core Drupal usando la riga di comando (strace & tcpdump)


0

Aggiungi questa funzione al tuo modulo. Quindi, aggiungi il tag debuga qualsiasi EFQ. È necessario abilitare il modulo Devel per stampare la query.

/**
 * 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);
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.