11

コードをデバッグするために、実行された明示的な SQL クエリを確認したいと思います。

を使用してクエリを作成しましたがcreateQueryBuilder、達成した最も明確なことは、次を使用して生のクエリを作成することです。

$qb->getQuery()->getSQL();

問題は、パラメーターの代わりにホルダー ( ?) が表示されることです。ウェブ上でいくつかの解決策を見つけましたが、それらは 1.3 および 1.4 用であり、Symfony-2 用のものではありません。

アイデア?ありがとう!

4

5 に答える 5

28

を使用してプレースホルダーで使用されるパラメーターにアクセスできる$query->getParameters()ため、次を使用してクエリをデバッグできます。

$query = $qb->getQuery();
print_r(array(
    'sql'        => $query->getSQL(),
    'parameters' => $query->getParameters(),
));
于 2012-07-07T23:43:34.917 に答える
2

次の方法を使用して、SQL パラメーターに簡単にアクセスできます。

   $result = $qb->getQuery()->getSQL();

   $param_values = '';  
   $col_names = '';   

   foreach ($result->getParameters() as $index => $param){              
            $param_values .= $param->getValue().',';
            $col_names .= $param->getName().',';
   } 

   //echo rtrim($param_values,',');
   //echo rtrim($col_names,',');    

したがって、 および を出力する$param_values$col_names、sql およびそれぞれの列名を通過するパラメーター値を取得できます。

注 :$param配列を返す場合は、反復する必要があります。内部のパラメーターIN (:?)は通常、ネストされた配列として渡されるためです。

それまでの間、別のアプローチを見つけた場合は、親切に私たちと共有してください:)

ありがとうございました!

于 2015-02-03T08:35:44.543 に答える
1

また、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 と共に使用して、パラメーターをその値に置き換えます。

もちろん、これはコア コードのハックであり、私は公開プロジェクトへの貢献に慣れていないので、そこに含めたいと思っている人は、自由にコピーしてください。

于 2018-04-06T18:39:09.137 に答える