web-gelistirme-sc.com

Db_select () kullanılarak oluşturulan sorguyu yazdırın

db_select () kullanılarak oluşturulan sorguyu programlı bir şekilde yazdırmak istiyorum. Drupal Soyutlama Katmanı tarafından sağlanan herhangi bir API işlevi var mı?
Views'daki sorgu çıktısına benzer, ancak hata ayıklama amacıyla özel modülümden yazdırmak istiyorum.

62
Sithu

SelectQuery, bir dizenin gerekli olduğu bağlamlarda çağrılan SelectQuery::__toString() uygular.

Aşağıdaki kodu düşünün.

global $theme_key;

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

print $query;

Çıkışı aşağıdaki gibidir.

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

Sorgu için kullanılan bağımsız değişken dizisini almak için SelectQuery::arguments() öğesini arayabilirsiniz.

Aşağıdaki kod, sorguyu ve bağımsız değişkenlerini Devel modülünden sağlanan işlevleri kullanarak yazdırır.

global $theme_key;

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

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

screenshot

Devel modülü gerekli değildir ve çıktıyı göstermek için drupal_set_message() yapabilirsiniz. Örneğin, yer tutucuları gerçek değerleriyle değiştirilmiş bir dize almak için aşağıdaki işlevi kullanabilirsiniz.

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

Gösterdiğim önceki örnek kod şu olacaktı.

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

SelectQuery::arguments() öğesinin yalnızca SelectQuery::__toString(), SelectQuery::compile() veya SelectQuery::execute() ; aksi takdirde, SelectQuery::arguments()NULL değerini döndürür.

Dize sorgusunu almak için aşağıdakine benzer bir işlev kullanabilirsiniz; yer tutucuları bağımsız değişkenlerle değiştirilir.

68
kiamlaluno

Sorguyu görüntülemek için dpq () ve sonucu görüntülemek için dpr () kullanabilirsiniz.

  $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

Başka bir seçenek:

global $theme_key;

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

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

Devel'i kurup yapılandırdığınızda yukarıdaki cevaplar iyidir.

Sorguyu Devel olmadan yazdırmanın en iyi yolu aşağıdaki gibidir.

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

Sorguyu yazdırmak için yukarıdaki yollardan birini kullanabiliriz.

8
KiranD

Ben Phpmyadmin doğrudan "SQL" bölümünde sorgu dizesini kopyalayıp yapıştırabilir ve sorgunuzu hata ayıklamak iyi bir çözüm var (Ben sorgu ile mücadele zaman genellikle bu yöntemi kullanı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);

Umarım bu diğer insanlar için faydalı olur.

4
Yusef

Drupal 8 Sürümü:

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