У мене є модуль, який погано поводиться. EFQ отримує несподівані результати, але я не можу зрозуміти, чому просто, дивлячись на код. Чи існує еквівалент dpq () для EFQ? Інші способи налагодження їх?
У мене є модуль, який погано поводиться. 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()
запиту, це вже не EntityFieldQuery
було перетворено на стандарт db_select()
, тому __tostring()
чудово працює :) Оскільки я працюю над цим, я його досить багато використовую, і він працює досить добре
hook_query_alter()
.
Замість того, щоб прокатати свій власний_укр__завдання (), ви можете дозволити модулю Devel зробити важкий підйом для вас, додавши debug
тег:
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug')
->execute();
Це надрукує запит на екран, як dpq()
би хотілося.
Додавання до відповіді @Clive, яка, як правило, друкує запит із заповнювачем місця не разом із значенням. Щоб надрукувати значення за допомогою запиту, використовуйте наступний код під купою_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'ed красиво :). Важлива частина коду вище - addTag ('nicedpq') - що запускає dpm()
.
Ви можете спробувати налагодити його через XDebug . Після встановлення зробіть xdebug_start_trace()
перед кодом і xdebug_stop_trace()
після цього, ви матимете чіткий журнал слідів, що було виконано та де.
Також ви можете включити реєстратор запитів у конфігурації MySQL.
Інший метод полягає у використанні 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 або DTracing MySQL , написавши власний сценарій.
Детальніше: Розширена налагодження ядра Drupal за допомогою командного рядка (strace & tcpdump)
Додайте цю функцію до свого модуля. Потім додайте тег 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);
}
}