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.
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());
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.
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());
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.
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.
Drupal 8 Sürümü:
$query = \Drupal::entityQuery('node')
->addTag('debug')
->execute();