it-swarm-vi.com

In truy vấn được xây dựng bằng db_select ()

Tôi muốn in truy vấn được xây dựng bằng cách sử dụng db_select () theo cách lập trình. Có bất kỳ hàm API nào được cung cấp bởi Drupal Lớp trừu tượng không?
[.__.] Nó tương tự như đầu ra truy vấn trong Chế độ xem, nhưng tôi muốn in nó từ mô-đun tùy chỉnh của mình cho mục đích gỡ lỗi.

62
Sithu

SelectQuery thực hiện SelectQuery::__toString() , được gọi trong bối cảnh yêu cầu một chuỗi.

Hãy xem xét các mã sau đây.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print $query;

Đầu ra của nó là một trong những sau đây.

SELECT block.*
FROM 
{block} block
WHERE  (theme = :db_condition_placeholder_0) AND (status = :db_condition_placeholder_1)

Để lấy mảng các đối số được sử dụng cho truy vấn, bạn có thể gọi SelectQuery::arguments() .

Đoạn mã sau in ra truy vấn và các đối số của nó bằng các hàm được tạo sẵn từ mô-đun Devel.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

dpm((string) $query);
dpm($query->arguments());

screenshot

Tuy nhiên, mô-đun Devel không cần thiết và bạn có thể drupal_set_message() để hiển thị đầu ra. Ví dụ: bạn có thể sử dụng hàm sau để lấy chuỗi có trình giữ chỗ được thay thế bằng giá trị thực của chúng.

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

Mã ví dụ trước tôi đã hiển thị sẽ trở thành mã sau.

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

drupal_set_message(format_string('Query: %query', array('%query' => _get_query_string($query))));

function _get_query_string(SelectQueryInterface $query) {
  $string = (string) $query;
  $arguments = $query->arguments();

  if (!empty($arguments) && is_array($arguments)) {
    foreach ($arguments as $placeholder => &$value) {
      if (is_string($value)) {
        $value = "'$value'";
      }
    }

    $string = strtr($string, $arguments);
  }

  return $string;
}

Lưu ý rằng SelectQuery::arguments() chỉ trả về mảng các đối số truy vấn khi nó được gọi sau SelectQuery::__toString(), SelectQuery::compile() , hoặc SelectQuery::execute() ; mặt khác, SelectQuery::arguments() trả về NULL.

Bạn có thể sử dụng một hàm tương tự như hàm sau để lấy truy vấn chuỗi, với các phần giữ chỗ được thay thế bằng các đối số.

68
kiamlaluno

Bạn có thể sử dụng dpq () để hiển thị truy vấn và dpr () để hiển thị kết quả.

  $query = db_select('users','u');
  $query->fields('u');
  $query->condition('u.uid', 1042);
  $result = $query->execute()->fetchAll();

  dpq($query); // Display the query. 
  dpr($result); // Display the query result.
47
umesh

Một lựa chọn khác là:

global $theme_key;

$query = db_select('block')
  ->condition('theme', $theme_key)
  ->condition('status', 1)
  ->fields('block');

print strtr((string) $query, $query->arguments());
19
vijaycs85

Các câu trả lời trên là tốt khi bạn đã cài đặt và cấu hình Devel.

Cách tốt nhất để in truy vấn mà không có Devel như dưới đây.

$query = db_select('block')
->condition('theme', $theme_key)
->condition('status', 1)
->fields('block');
//One way
echo $query->__toString();
// Second way
echo (string)$query;

Chúng ta có thể sử dụng một trong những cách trên để in truy vấn.

8
KiranD

Tôi có một giải pháp tốt là bạn có thể sao chép/dán chuỗi truy vấn của mình trực tiếp trong phần "SQL" trong Phpmyadmin và gỡ lỗi truy vấn của bạn (Tôi thường sử dụng phương pháp này khi tôi vật lộn với truy vấn)

$querystring=$query->__toString();
$querystring=str_replace("{",'',$querystring);
$querystring=str_replace("}",'',$querystring);
foreach($query->getArguments() as $key=> $item){

    if(!$item) {
        $item = 'NULL';
    }
    $querystring=str_replace($key.')',$item.')',$querystring);
}
dpm($querystring);

Tôi hy vọng điều này sẽ hữu ích cho những người khác.

4
Yusef

Phiên bản Drupal 8:

$query = \Drupal::entityQuery('node')
    ->addTag('debug')
    ->execute();
0
Tien Wang