Налагодження EntityFieldQuery?


27

У мене є модуль, який погано поводиться. EFQ отримує несподівані результати, але я не можу зрозуміти, чому просто, дивлячись на код. Чи існує еквівалент dpq () для EFQ? Інші способи налагодження їх?


Подібне запитання: drupal.stackexchange.com/questions/33473/… . Чи можете ви кинути об’єкт запиту на рядок, щоб перевірити його, щоб побачити, чи дає SQL якісь підказки?
Клайв

1
Чудові пропозиції, однак: Виправлена ​​фатальна помилка: Об'єкт класу EntityFieldQuery не вдалося перетворити на рядок :(
Letharion

Відповіді:


36

Це хакей, але ви можете додати тег до будь-якого, хто 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 як системи зберігання в місцях.


Теоретично звучить чудово, але як щодо коментарів до питання? EFQ не реалізує __toString ()?
Летаріон

4
На той момент, коли він потрапляє до hook_query_alter()запиту, це вже не EntityFieldQueryбуло перетворено на стандарт db_select(), тому __tostring()чудово працює :) Оскільки я працюю над цим, я його досить багато використовую, і він працює досить добре
Clive

Підтверджено, що пересилання на рядок працює, коли запит потрапляє hook_query_alter().
jhedstrom

Щоб побачити аргументи запитів (": entit_type" у наведеному вище прикладі), ви можете використовувати dpm ($ query-> argument ());
sanzante

13

Замість того, щоб прокатати свій власний_укр__завдання (), ви можете дозволити модулю Devel зробити важкий підйом для вас, додавши debugтег:

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

Це надрукує запит на екран, як dpq()би хотілося.


4

Додавання до відповіді @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();

Недоцільно встановлювати модуль для кількох рядків коду. Саме тому я вибрав вищезгадане рішення.


2

Якщо ви завантажите розроблену версію 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().


приємний альтернативний спосіб розробити. Не вдалося знайти цей модуль безпосередньо через DO, оскільки вони видалили відповідний блок модуля, який був там ранньою.
kiranking

1

Ви можете спробувати налагодити його через 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)


0

Додайте цю функцію до свого модуля. Потім додайте тег 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);
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.