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?
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?
Risposte:
È un po 'un trucco, ma potresti aggiungere un tag a chiunque EntityFieldQuery
tu 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.
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
hook_query_alter()
.
Invece di lanciare il tuo hook_query_alter () puoi lasciare che il modulo Devel faccia il lavoro pesante per te aggiungendo il debug
tag:
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug')
->execute();
Questo stamperà la query sullo schermo, proprio come dpq()
farebbe.
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.
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()
.
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)
Aggiungi questa funzione al tuo modulo. Quindi, aggiungi il tag debug
a 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);
}
}