web-dev-qa-db-ja.com

DoctrineでRaw SQLを使用する

アプリケーションでレポートを生成するために使用する必要がある非常に複雑なクエリがいくつかあります。私はフレームワークとしてsymfonyを使用し、ORMとしてdoctrineを使用しています。

私の質問はこれです:

非常に複雑なSQLクエリをDoctrineに変換せずに直接Doctrineクエリ言語に直接渡す最良の方法は何ですか? _Raw_SQL_拡張ですが、クエリをセクションで渡す必要があるようです(from()など)。生のSQLコマンドの束にダンプするだけのものはありますか?

41
Levi Hackwith
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");

さまざまな実行方法については、Doctrine APIドキュメントを参照してください。

50
Tom

はい。次のコードを使用して、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つの配列(キー列値としての値)。

39
richsage

Doctrine2はPDOをベースとして使用することに注意してください。したがって、単純な古い実行よりも準備されたステートメントを使用することをお勧めします。

例:

$db = Doctrine_Manager::getInstance()->getCurrentConnection();
$query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value");
$query->execute(array('value' => 'someValue'));
6

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);
     }
}
6
takeshin

Doctrine_RawSql()を使用することもできます; doctrineオブジェクトにハイドレートする生のSQLクエリを作成します。

6
Twelve47

Symfonyは、ドクトリンを使用して生のSQLを挿入します。

バージョンSymfoney 1.3のこれ

$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute($query);
0
SMSM