Отладка EntityFieldQuery?

У меня есть модуль, который плохо работает. EFQ сохраняет неожиданные результаты, но я не вижу why , просто просматривая код. Существует ли эквивалент dpq () для EFQ? Другие способы их отладки?

26 голосов | спросил Letharion 10 J000000Tuesday12 2012, 12:30:12

6 ответов


36

Это небольшая часть взлома, но вы можете добавить тег к любому EntityFieldQuery , который вам интересен для печати запроса, а затем реализовать hook_query_alter () , чтобы перехватить его, когда это standard SelectQuery , затем переведите его в строку для отладки:

  функция MYMODULE_query_alter ($ query) {
  if ($ query-> hasTag ('efq_debug')) {
    пм ((строка) $ запроса);
  }
}

$ q = новый EntityFieldQuery;
$ q-> entityCondition ('entity_type', 'node')
  - & GT; addTag ( 'efq_debug')
  - & GT; выполнение ();
 

Это немного взломать, но делает трюк. Вывод для выше:

  SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle,: entity_type
AS entity_type
Узел {узел}
 

Предположительно это будет работать только при использовании MySQL в качестве системы хранения на местах.

ответил Clive 10 J000000Tuesday12 2012, 12:59:36
12

Вместо того, чтобы перематывать свой собственный hook_query_alter (), вы можете позволить модулю Devel сделать тяжелый подъем для вас:

  $ q = new EntityFieldQuery;
$ q-> entityCondition ('entity_type', 'node');
  - & GT; addTag ( 'отладить')
  - & GT; выполнение ();
 

Для этого требуется этот патч http://drupal.org/node/1858318#comment-6809882 (Если он еще не был зафиксирован к моменту, когда вы это прочитали)

ответил Dalin 4 TueEurope/Moscow2012-12-04T22:41:14+04:00Europe/Moscow12bEurope/MoscowTue, 04 Dec 2012 22:41:14 +0400 2012, 22:41:14
3

Добавление в ответ @Clive, который обычно печатает запрос с помощью заполнителя не вместе со значением. Чтобы напечатать значение с запросом, используйте следующий код под hook_query_alter.

  function hook_query_alter ($ query) {
  if ($ query-> hasTag ('debug')) {
    $ sql = (строка) $ query;
    $ connection = База данных :: getConnection ();
    foreach ((array) $ query-> arguments () как $ key => $ val) {
      $ quoted [$ key] = $ connection-> quote ($ val);
    }
    $ sql = strtr ($ sql, $ quoted);
    пм ($ SQL);
  }
}


$ q = новый EntityFieldQuery;
$ q-> entityCondition ('entity_type', 'node');
  - & GT; addTag ( 'отладить');
  - & GT; выполнение ();
 

Не рекомендуется устанавливать модуль для нескольких строк кода. Вот почему я выбрал вышеупомянутое решение.

ответил Sukhjinder Singh 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 11 Sep 2014 12:06:33 +0400 2014, 12:06:33
2

Если вы загрузите версию dev Nice DPQ (или что-нибудь => 1.1), вы можете просто сделать:

  $ user_query = new EntityFieldQuery ();
$ User_query- & GT; entityCondition ( 'ENTITY_TYPE', 'пользователь');
$ User_query- & GT; addTag ( 'nicedpq');
$ user_result = $ user_query-> execute ();
 

, и вы получите запрос dpm'ed красиво :). Важная часть приведенного выше кода addTag ('nicedpq') - запускает dpm () .

ответил mojzis 8 J000000Tuesday14 2014, 00:02:37
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 & amp; 1 | grep SPECIFIC_TEXT
     

Обратите внимание, что dtruss - это просто сценарий, который использует DTrace, поэтому вы можете рассмотреть прямую реализацию PHP DTrace static probes или DTracing MySQL , написав собственный скрипт.

Подробнее: Расширенная отладка ядра Drupal с использованием командной строки (strace & amp; tcpdump)

ответил kenorb 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 19 Sep 2013 18:39:20 +0400 2013, 18:39:20
0

Добавьте эту функцию в свой модуль. Затем добавьте тег debug в любой EFQ. Требуется, чтобы модуль Devel был включен для печати запроса.

  /**
 * Реализует hook_query_TAG_alter ().
 *
 * Добавьте тег 'debug' в любой EFQ, и это напечатает запрос на сообщения.
 *
 * @param \ QueryAlterableInterface $ query
 * /
функция MYMODULE_query_debug_alter (QueryAlterableInterface $ query) {
  if (function_exists ('dpq') & amp;! $ query-> hasTag ('debug-semaphore')) {
    $ Query- & GT; addTag ( 'отладочный-семафора');
    Dpq ($ запроса);
  }
}
 
ответил KeyboardCowboy 10 Maypm17 2017, 20:09:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132