次のコードを前提として、生成されたSQLを出力するにはどうすればよいですか?
_$bundle='my_bundle_type';
$query = \Drupal::entityQuery('node');
$query->condition('status', 1);
$query->condition('type', $bundle);
$entity_ids = $query->execute();
_
私が試したこと:
__toString()
が機能しないdpq($query)
はエラーをスローしますデバッグタグ(develモジュールは必須)を使用すると、未加工のSQLを出力できます。
$query = \Drupal::entityQuery('foo')->condition('bar', 'xyz')->addTag('debug');
$ids = $query->execute();
[〜#〜]更新[〜#〜]
私の元の答えはもう有効ではありません。これに対する良い解決策があります。 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 $sqlQuery
はpublic $sqlQuery;
。
次に、内部プロパティで 開発モジュールのdpq関数 を使用できます。 devel モジュールがインストールされている(有効になっている)ことを確認します。
DBTNG SelectオブジェクトからSQL文字列を出力します。引用された引数を含みます。
だからあなたの場合:
$sql_string = dpq($query->sqlQuery, TRUE));
あるいは単に:
kint(dpq($query->sqlQuery, TRUE));
object $ query:SelectInterfaceインターフェースを実装するオブジェクト。
boolean $ return:文字列を返すかどうか。デフォルトはFALSEで、これを出力して、代わりに$ queryを返します。
string $ name:出力を識別するためのオプションの名前。
これは汚いトリックです。完了したら、Query.phpファイルを元に戻してください。ハッキングDrupalコアは非常に悪い習慣であり、それを行うと子猫、ポニー、および他の子犬が苦しんでいます。たぶん、いくつかのユニコーンでも-よく考えてください。
これは汚い回避策です。別のより良いアプローチが存在するかもしれませんが、私はそれを知りません。より良い方法がない場合Drupalコアは、デバッグ時に必要となる場合があるため、SQL文字列を取得するためにいくつかの機能を追加する場合があり、率直に言って、このハックはそれを行う良い方法ではありません。
ここに別のアプローチがあります:
Drupal 8?)でエンティティクエリをデバッグするにはどうすればよいですか?
このリンクの質問を参照してください。これは私にとってうまくいった解決策です。カスタムモジュールにこれらの2つの関数を追加する場合、エンティティクエリに「デバッグ」のタグを付けて、SQLクエリの文字列バージョンを出力するだけです。