アプリケーションでレポートを生成するために使用する必要がある非常に複雑なクエリがいくつかあります。私はフレームワークとしてsymfonyを使用し、ORMとしてdoctrineを使用しています。
私の質問はこれです:
非常に複雑なSQLクエリをDoctrineに変換せずに直接Doctrineクエリ言語に直接渡す最良の方法は何ですか? _Raw_SQL
_拡張ですが、クエリをセクションで渡す必要があるようです(from()
など)。生のSQLコマンドの束にダンプするだけのものはありますか?
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");
さまざまな実行方法については、Doctrine APIドキュメントを参照してください。
はい。次のコードを使用して、Doctrineからデータベースハンドルを取得できます。
$pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();
次に、次のようにSQLを実行します。
$query = "SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2";
$stmt = $pdo->prepare($query);
$params = array(
"param1" => "value1",
"param2" => "value2"
);
$stmt->execute($params);
$results = $stmt->fetchAll();
上記の例のように、バインドされた変数を使用できます。
Doctrineは自動的に結果をレコードオブジェクトなどにうまくハイドレイトしないので、返される行ごとに1つの配列(キー列値としての値)。
Doctrine2はPDOをベースとして使用することに注意してください。したがって、単純な古い実行よりも準備されたステートメントを使用することをお勧めします。
例:
$db = Doctrine_Manager::getInstance()->getCurrentConnection();
$query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value");
$query->execute(array('value' => 'someValue'));
raw SQLと言っているのかわかりませんが、従来のSQLクエリをこの方法で実行する必要があります。
...
// $this->_displayPortabilityWarning();
$conn = Doctrine_Manager::connection();
$pdo = $conn->execute($sql);
$pdo->setFetchMode(Doctrine_Core::FETCH_ASSOC);
$result = $pdo->fetchAll();
...
次の方法は必須ではありませんが、良い方法を示しています。
protected function _displayPortabilityWarning($engine = 'pgsql')
{
$conn = Doctrine_Manager::connection();
$driver = $conn->getDriverName();
if (strtolower($engine) != strtolower($driver)) {
trigger_error('Here we have possible database portability issue. This code was tested on ' . $engine . ' but you are trying to run it on ' . $driver, E_USER_NOTICE);
}
}
Doctrine_RawSql()を使用することもできます; doctrineオブジェクトにハイドレートする生のSQLクエリを作成します。
Symfonyは、ドクトリンを使用して生のSQLを挿入します。
バージョンSymfoney 1.3のこれ
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute($query);