it-swarm.com.de

Drucken Sie die Abfrage, die mit db_select () erstellt wurde.

Ich möchte die Abfrage, die mit db_select () erstellt wurde, programmgesteuert drucken. Gibt es eine API-Funktion, die von Drupal Abstraction Layer) bereitgestellt wird?
Es ähnelt der Abfrageausgabe in Ansichten, aber ich möchte es zu Debugging-Zwecken von meinem benutzerdefinierten Modul aus drucken.

62
Sithu

SelectQuery implementiert SelectQuery::__toString() , das in den Kontexten aufgerufen wird, in denen eine Zeichenfolge erforderlich ist.

Betrachten Sie den folgenden Code.

global $theme_key;

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

print $query;

Die Ausgabe ist die folgende.

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

Um das für die Abfrage verwendete Argumentarray abzurufen, können Sie SelectQuery::arguments() aufrufen.

Der folgende Code druckt die Abfrage und ihre Argumente mithilfe der vom Devel-Modul zur Verfügung gestellten Funktionen.

global $theme_key;

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

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

(screenshot

Das Devel-Modul ist jedoch nicht erforderlich, und Sie können drupal_set_message(), um die Ausgabe anzuzeigen. Sie können beispielsweise die folgende Funktion verwenden, um eine Zeichenfolge zu erhalten, bei der die Platzhalter durch ihre tatsächlichen Werte ersetzt werden.

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

Der vorherige Beispielcode, den ich gezeigt habe, wird der folgende.

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

Beachten Sie, dass SelectQuery::arguments() das Array von Abfrageargumenten nur zurückgibt, wenn es nach SelectQuery::__toString(), SelectQuery::compile() oder SelectQuery::execute() ; Andernfalls gibt SelectQuery::arguments()NULL zurück.

Sie können eine ähnliche Funktion wie die folgende verwenden, um die Zeichenfolgenabfrage abzurufen, wobei die Platzhalter durch die Argumente ersetzt werden.

68
kiamlaluno

Sie können dpq () verwenden, um die Abfrage anzuzeigen, und dpr () , um das Ergebnis anzuzeigen.

  $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

Eine weitere Option ist:

global $theme_key;

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

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

Die obigen Antworten sind gut, wenn Sie Devel installiert und konfiguriert haben.

Der beste Weg, um die Abfrage ohne Devel zu drucken, ist wie folgt.

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

Wir können eine der oben genannten Möglichkeiten verwenden, um die Abfrage zu drucken.

8
KiranD

Ich habe eine gute Lösung, mit der Sie Ihre Abfragezeichenfolge direkt im Abschnitt "SQL" in Phpmyadmin kopieren/einfügen und Ihre Abfrage debuggen können (ich verwende diese Methode häufig, wenn ich Probleme mit der Abfrage habe).

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

Ich hoffe, das ist nützlich für andere Leute.

4
Yusef

Drupal 8 Version:

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