web-dev-qa-db-ja.com

Doctrine 2を使用して生のSQLを実行します

Doctrine 2を使用して生のSQLを実行したい

データベーステーブルを切り捨て、デフォルトのテストデータでテーブルを初期化する必要があります。

96
Jiew Meng

答えはおそらく次のとおりです。

NativeQueryを使用すると、仕様に従って結果をマッピングし、ネイティブSQLを実行できます。 SQL結果セットがDoctrine結果にどのようにマップされるかを説明するこのような仕様は、ResultSetMappingによって表されます。

ソース: ネイティブSQL

12
Jiew Meng

これが、私がやっているDoctrine 2の生のクエリの例です:

public function getAuthoritativeSportsRecords()
{   
    $sql = " 
        SELECT name,
               event_type,
               sport_type,
               level
          FROM vnn_sport
    ";

    $em = $this->getDoctrine()->getManager();
    $stmt = $em->getConnection()->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll();
}   
158
Jason Swett
//$sql - sql statement
//$em - entity manager

$em->getConnection()->exec( $sql );
50
orourkedd

PDOを使用していると仮定して、これを行うことで動作するようになりました。

//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";

//set parameters 
//you may set as many parameters as you have on your query
$params['color'] = blue;


//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);

FETCH_TYPEは、ニーズに合わせて変更できます。

39
fernandodof

生のクエリを実行してデータを返す方法。

マネージャーにフックして、新しい接続を作成します。

$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();

クエリとfetchAllを作成します。

$result= $conn->query('select foobar from mytable')->fetchAll();

次のように結果からデータを取得します。

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
12
Eric Leschinski

モデルで生のSQLステートメントを作成します(以下の例は、使用する必要がありましたが、独自の日付間隔の例です。SELECTを実行している場合、execute()呼び出しに-> fetchall()を追加します。

   $sql = "DELETE FROM tmp 
            WHERE lastedit + INTERVAL '5 minute' < NOW() ";

    $stmt = $this->getServiceLocator()
                 ->get('Doctrine\ORM\EntityManager')
                 ->getConnection()
                 ->prepare($sql);

    $stmt->execute();
5
badzilla

同じ問題がありました。エンティティマネージャが提供する接続オブジェクトを確認します。

$conn = $em->getConnection();

次に、それに対して直接クエリ/実行できます:

$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');

http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html で接続オブジェクトのドキュメントを参照してください

5
Toby Batch

Doctrine 2は生のクエリを許可しません。できるように思えるかもしれませんが、次のようなものを試してみると:

$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);

DoctrineはDATE_FORMATが未知の関数であるというエラーを吐き出します。

しかし、私のデータベース(mysql)はその機能を知っているので、基本的にDoctrineは、そのクエリを舞台裏(および背後)で解析し、理解できない式を見つけて、無効なクエリ。

私のように、単に文字列をデータベースに送信して処理できるようにしたい(そして開発者にセキュリティの全責任を負わせたい)のであれば、それを忘れてください。

もちろん、何らかの方法でそれを可能にする拡張機能をコーディングできますが、mysqliを使用してDoctrineをORMビジネスに任せることもできます。

4
Alexis Finn