Gỡ lỗi EntityFieldQuery?


27

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 hỏi tương tự: drupal.stackexchange.com/questions/33473/ . Bạn có thể truyền đối tượng truy vấn thành một chuỗi để kiểm tra xem SQL có đưa ra manh mối nào không?
Clive

1
Tuy nhiên, các đề xuất tuyệt vời: Lỗi nghiêm trọng có thể phục hồi: Không thể chuyển đổi đối tượng của lớp EntityFieldQuery thành chuỗi :(
Letharion

Câu trả lời:


36

Đó là một chút hack, nhưng bạn có thể thêm một thẻ vào bất kỳ EntityFieldQuerybạ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.


Nghe có vẻ tuyệt vời trên lý thuyết, nhưng những bình luận về câu hỏi thì sao? EFQ không triển khai __toString ()?
Letharion

4
Vào thời điểm hook_query_alter()truy vấn không EntityFieldQuerycò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
Clive

Xác nhận rằng truyền vào chuỗi hoạt động khi truy vấn được hook_query_alter().
jhedstrom

Để xem các đối số truy vấn (": entity_type" trong ví dụ trên), bạn có thể sử dụng dpm ($ query-> argument ());
sanzante

13

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 debugthẻ:

$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.


4

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.


2

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().


giải pháp thay thế tốt đẹp để phát. Không thể tìm thấy mô-đun đó trực tiếp trên DO vì họ đã loại bỏ khối mô-đun liên quan có ở đó.
kiranking

1

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 đó dtrusschỉ 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)


0

Thêm chức năng này vào mô-đun của bạn. Sau đó, thêm thẻ debugvà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);
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.