it-swarm-id.com

Cetak kueri yang dibangun menggunakan db_select ()

Saya ingin mencetak kueri yang dibangun menggunakan db_select () secara terprogram. Apakah ada fungsi API yang disediakan oleh Drupal Abstraction Layer?
Ini mirip dengan hasil kueri dalam Tampilan, tetapi saya ingin mencetaknya dari modul khusus saya untuk tujuan debugging.

62
Sithu

SelectQuery mengimplementasikan SelectQuery::__toString() , yang disebut dalam konteks di mana string diperlukan.

Pertimbangkan kode berikut.

global $theme_key;

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

print $query;

Keluarannya adalah sebagai berikut.

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

Untuk mendapatkan array argumen yang digunakan untuk kueri, Anda dapat memanggil SelectQuery::arguments() .

Kode berikut mencetak kueri dan argumennya menggunakan fungsi yang tersedia dari modul Devel.

global $theme_key;

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

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

screenshot

Modul Devel tidak perlu, dan Anda dapat drupal_set_message() untuk menampilkan output. Misalnya, Anda bisa menggunakan fungsi berikut untuk mendapatkan string dengan placeholder diganti dengan nilai aktualnya.

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;
}

Contoh kode sebelumnya yang saya tunjukkan akan menjadi yang berikut.

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;
}

Perhatikan bahwa SelectQuery::arguments() mengembalikan array argumen kueri hanya ketika dipanggil setelah SelectQuery::__toString(), SelectQuery::compile() , atau SelectQuery::execute() ; jika tidak, SelectQuery::arguments() mengembalikan NULL.

Anda bisa menggunakan fungsi yang mirip dengan yang berikut ini untuk mendapatkan kueri string, dengan placeholder diganti dengan argumen.

68
kiamlaluno

Anda dapat menggunakan dpq () untuk menampilkan kueri, dan dpr () untuk menampilkan hasilnya.

  $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

Pilihan lain adalah:

global $theme_key;

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

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

Jawaban di atas baik ketika Anda telah menginstal dan mengkonfigurasi Devel.

Cara terbaik untuk mencetak kueri tanpa Devel adalah seperti di bawah ini.

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

Kami dapat menggunakan salah satu cara di atas untuk mencetak kueri.

8
KiranD

Saya punya solusi yang bagus sehingga Anda bisa menyalin/menempelkan string kueri Anda langsung di bagian "SQL" di Phpmyadmin dan men-debug permintaan Anda (saya sering menggunakan metode ini ketika saya berjuang dengan permintaan)

$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);

Saya harap ini bermanfaat bagi orang lain.

4
Yusef

Versi Drupal 8:

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