Doctrine 2を使用して生のSQLを実行したい
データベーステーブルを切り捨て、デフォルトのテストデータでテーブルを初期化する必要があります。
答えはおそらく次のとおりです。
NativeQueryを使用すると、仕様に従って結果をマッピングし、ネイティブSQLを実行できます。 SQL結果セットがDoctrine結果にどのようにマップされるかを説明するこのような仕様は、ResultSetMappingによって表されます。
ソース: ネイティブSQL 。
これが、私がやっている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();
}
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
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は、ニーズに合わせて変更できます。
マネージャーにフックして、新しい接続を作成します。
$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']);
モデルで生の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();
同じ問題がありました。エンティティマネージャが提供する接続オブジェクトを確認します。
$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 で接続オブジェクトのドキュメントを参照してください
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ビジネスに任せることもできます。