また、DQL クエリからパラメーターが挿入された SQL を取得してデバッグを支援する方法も探していました。たとえば、phpmyadmin に直接貼り付けたり、説明を追加したりできる SQL 文字列を出力できるようにする方法を探していました。
とにかく、私はNéoの答えに基づいて答えました.プライベートメソッド呼び出しのためにそれを機能させることができなかったので、以下のようにDoctrine\ORM\Query内に関数を作成することで適応しました:
/**
* Execute query and return the SQL with params injected.
*
* @return string
* @throws QueryException
*/
public function executeAndGetSqlWithParams(): string
{
// Execute the query to get the parser result.
$this->execute();
// Declare the SQL for use in the vsprintf function.
$sql = str_replace('?', '%s', $this->getSQL());
// Declare the SQL parameter mappings.
$parameterMappings = $this->processParameterMappings($this->_parserResult->getParameterMappings());
/**
* TODO: Possibly replace each question mark by the correct vsprintf argument using $parameterMappings[1].
*
* Right now all parameters are treated as strings.
*/
// Declare and define the SQL parameters.
$sqlParameters = [];
foreach ($parameterMappings[0] as $parameter)
{
if (is_array($parameter))
{
$sqlParameters[] = implode(',', $parameter);
}
else
{
$sqlParameters[] = $parameter;
}
}
// Return the SQL with its parameters injected.
return vsprintf($sql, $sqlParameters);
}
その名前が示すように、パーサーの結果からパラメーター マッピングを取得するためにクエリを実行し、それを vsprintf と共に使用して、パラメーターをその値に置き換えます。
もちろん、これはコア コードのハックであり、私は公開プロジェクトへの貢献に慣れていないので、そこに含めたいと思っている人は、自由にコピーしてください。