답변:
그것은 약간의 해킹이지만 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()
그것을 꽤 많이 사용하고 I에서이 작업 때문에 :) 잘 작동하고 꽤 잘 작동
hook_query_alter()
.
@Clive 답변에 추가하면 일반적으로 값과 함께 자리 표시 자와 함께 쿼리가 인쇄됩니다. 조회와 함께 값을 인쇄하려면 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();
몇 줄의 코드에 모듈을 설치하는 것은 좋지 않습니다. 그래서 위에서 언급 한 솔루션을 선택했습니다.
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 쿼리를 멋지게 얻을 것입니다 :). 코드의 중요한 부분은 위이다 ( 'nicedpq') addTag 트리거하는 그 - dpm()
.
XDebug 를 통해 디버깅을 시도 할 수 있습니다 . 일단 설치되면, xdebug_start_trace()
코드 전에, 그리고 그 xdebug_stop_trace()
후에, 무엇이 실행되었는지와 어디에서 명확한 추적 로그를 보게 될 것입니다.
또한 MySQL 구성에서 쿼리 로거를 활성화 할 수 있습니다.
다른 방법은 디버거와 같은 strace / truss / dtrus를 사용하는 것입니다.
dtruss를 사용한 예 :
모든 쿼리
sudo dtruss -t read -n mysqld
특정 검색어
sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
참고 dtruss
단지의 DTrace를 사용하는 스크립트입니다, 그래서 당신의 직접적인 구현 고려할 수있다 PHP의 DTrace 정적 프로브 또는 DTracing MySQL이 자신의 스크립트를 작성하여.
이 기능을 모듈에 추가하십시오. 그런 다음 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);
}
}