web-dev-qa-db-ja.com

Drupal :: entityQueryから純粋なSQLを取得する

次のコードを前提として、生成されたSQLを出力するにはどうすればよいですか?

_$bundle='my_bundle_type';
$query = \Drupal::entityQuery('node');
$query->condition('status', 1);
$query->condition('type', $bundle);
$entity_ids = $query->execute();
_

私が試したこと:

  • __toString()が機能しない
  • dpq($query)はエラーをスローします
7
Oleg Videnov

デバッグタグ(develモジュールは必須)を使用すると、未加工のSQLを出力できます。

$query = \Drupal::entityQuery('foo')->condition('bar', 'xyz')->addTag('debug');
$ids = $query->execute();
9

[〜#〜]更新[〜#〜]

私の元の答えはもう有効ではありません。これに対する良い解決策があります。 Sukhjinder Singh answer を参照してください。つまり、Develモジュールを使用してタグ「debug」を追加し、それを実行すると、クエリが出力されます。

$entityQueryObject->addTag('debug')->execute();

元の回答

@kiamlalunoが言うように、問題は \ Drupal :: entityQuery()QueryInterface を実装し、 SelectInterface ではありません。 dpqは、そのSelectInterfaceを実装するために最初の引数を必要とします。

\ Drupal :: entityQuery()によって返されるオブジェクトは Drupal\Core\Entity\Query\Sql\Query です。このオブジェクトには、SelectInterfaceを実装する保護されたプロパティがあります。

  /**
   * The build sql select query.
   *
   * @var \Drupal\Core\Database\Query\SelectInterface
   */
  protected $sqlQuery;

残念ながら、Queryオブジェクトは$ sqlQueryへのアクセスやSQL文字列の出力を許可していません。

非常に迅速で汚いハックとして、core/lib/Drupal/Core/Entity /でクエリクラスファイルを編集できますQuery/Sql/Query.php、$ sqlQueryプロパティをパブリックに変更し、直接アクセスします。

Query.phpでは、protected $sqlQuerypublic $sqlQuery;

次に、内部プロパティで 開発モジュールのdpq関数 を使用できます。 devel モジュールがインストールされている(有効になっている)ことを確認します。

DBTNG SelectオブジェクトからSQL文字列を出力します。引用された引数を含みます。

だからあなたの場合:

$sql_string = dpq($query->sqlQuery, TRUE));

あるいは単に:

kint(dpq($query->sqlQuery, TRUE));

dpq()パラメータ

  • object $ query:SelectInterfaceインターフェースを実装するオブジェクト。

  • boolean $ return:文字列を返すかどうか。デフォルトはFALSEで、これを出力して、代わりに$ queryを返します。

  • string $ name:出力を識別するためのオプションの名前。

重要!!

これは汚いトリックです。完了したら、Query.phpファイルを元に戻してください。ハッキングDrupalコアは非常に悪い習慣であり、それを行うと子猫、ポニー、および他の子犬が苦しんでいます。たぶん、いくつかのユニコーンでも-よく考えてください。

最終的な考え

これは汚い回避策です。別のより良いアプローチが存在するかもしれませんが、私はそれを知りません。より良い方法がない場合Drupalコアは、デバッグ時に必要となる場合があるため、SQL文字列を取得するためにいくつかの機能を追加する場合があり、率直に言って、このハックはそれを行う良い方法ではありません。

7
sanzante

ここに別のアプローチがあります:

Drupal 8?)でエンティティクエリをデバッグするにはどうすればよいですか?

このリンクの質問を参照してください。これは私にとってうまくいった解決策です。カスタムモジュールにこれらの2つの関数を追加する場合、エンティティクエリに「デバッグ」のタグを付けて、SQLクエリの文字列バージョンを出力するだけです。

1
oknate