Tôi có một mô-đun hoạt động sai. Một EFQ đang giữ lại kết quả bất ngờ, nhưng tôi không thể hiểu tại sao chỉ bằng cách xem mã. Có dpq () tương đương với EFQ không? Những cách khác để gỡ lỗi chúng?
Tôi có một mô-đun hoạt động sai. Một EFQ đang giữ lại kết quả bất ngờ, nhưng tôi không thể hiểu tại sao chỉ bằng cách xem mã. Có dpq () tương đương với EFQ không? Những cách khác để gỡ lỗi chúng?
Câu trả lời:
Đó là một chút hack, nhưng bạn có thể thêm một thẻ vào bất kỳ EntityFieldQuery
bạn quan tâm đến việc in truy vấn, sau đó thực hiện hook_query_alter()
để chặn nó khi đó là một tiêu chuẩn SelectQuery
, sau đó chuyển nó thành chuỗi để gỡ lỗi:
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();
Đó là một chút hack nhưng thực hiện các mẹo. Đầu ra cho ở trên là:
SELECT node.nid AS entity_id, node.vid AS revision_id, node.type AS bundle, :entity_type
AS entity_type
FROM {node} node
Có lẽ điều này cũng sẽ chỉ hoạt động khi sử dụng MySQL làm hệ thống lưu trữ trường.
hook_query_alter()
truy vấn không EntityFieldQuery
còn nữa, nó đã được chuyển đổi thành một tiêu chuẩn db_select()
, rất hiệu __tostring()
quả :) Từ khi làm việc này tôi đã sử dụng nó khá nhiều và nó hoạt động khá tốt
hook_query_alter()
.
Thay vì cuộn hook_query_alter () của riêng bạn, bạn có thể để mô-đun Devel thực hiện công việc nặng nhọc cho bạn bằng cách thêm debug
thẻ:
$q = new EntityFieldQuery;
$q->entityCondition('entity_type', 'node');
->addTag('debug')
->execute();
Điều này sẽ in truy vấn ra màn hình, giống như dpq()
muốn.
Thêm vào câu trả lời @Clive, thường in truy vấn với trình giữ chỗ không cùng với giá trị. Để in giá trị bằng truy vấn, hãy sử dụng đoạn mã sau trong 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();
Nó không phải là thực hành tốt để cài đặt một mô-đun cho một vài dòng mã. Đó là lý do tại sao tôi chọn giải pháp nói trên.
Nếu bạn tải xuống phiên bản dev của Nice DPQ (hoặc bất cứ điều gì => 1.1), bạn chỉ cần làm:
$user_query = new EntityFieldQuery();
$user_query->entityCondition('entity_type','user');
$user_query->addTag('nicedpq');
$user_result = $user_query->execute();
và bạn sẽ nhận được truy vấn dpm'ed độc đáo :). Phần quan trọng trong mã ở trên là addTag ('nicespq') - kích hoạt dpm()
.
Bạn có thể thử gỡ lỗi thông qua XDebug . Sau khi cài đặt, hãy thực hiện xdebug_start_trace()
trước mã và xdebug_stop_trace()
sau đó, sau đó bạn sẽ có nhật ký theo dõi rõ ràng những gì đã được thực hiện và ở đâu.
Ngoài ra, bạn có thể kích hoạt bộ ghi truy vấn trong cấu hình MySQL.
Phương pháp khác là sử dụng strace / truss / dtruss như trình gỡ lỗi.
Ví dụ sử dụng dtruss:
tất cả các truy vấn
sudo dtruss -t read -n mysqld
truy vấn cụ thể
sudo dtruss -t read -n mysqld 2>&1 | grep SPECIFIC_TEXT
Lưu ý rằng đó dtruss
chỉ là một tập lệnh sử dụng DTrace, vì vậy bạn có thể xem xét triển khai trực tiếp các thăm dò tĩnh DTrace PHP hoặc DTracing MySQL bằng cách viết tập lệnh của riêng bạn.
Đọc thêm: Gỡ lỗi nâng cao lõi Drupal bằng dòng lệnh (strace & tcpdump)
Thêm chức năng này vào mô-đun của bạn. Sau đó, thêm thẻ debug
vào bất kỳ EFQ. Yêu cầu mô-đun Devel được bật để in truy vấn.
/**
* 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);
}
}