回答:
これが私がやっている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();
}
...getConnection()->query($sql);
実行する必要はありませんでした$stmt->execute();
EntityManagerInterface $entityManager
を入力してから呼び出すことができることに注意してください$entityManager->getConnection()
//$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']);
答えはおそらく次のとおりです:
NativeQueryを使用すると、ネイティブSQLを実行し、指定に従って結果をマッピングできます。SQL結果セットがDoctrineの結果にどのようにマッピングされるかを記述するこのような仕様は、ResultSetMappingによって表されます。
ソース:ネイティブSQL。
私も同じ問題を抱えていました。エンティティマネージャによって提供された接続オブジェクトを調べたいと思います:
$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にある接続オブジェクトのドキュメントを参照してください
モデルで生の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();
できません。Doctrine2は生のクエリを許可していません。それはあなたができるように見えるかもしれませんが、あなたがこのようなことをしようとすると:
$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ビジネスに任せることもできます。
mysqldump
sを実行したり、以前のダンプからデータを読み込んだり、テーブルをドロップしたりするなど、自動データベースグラントワークを実行する場合は、通常、その作業用のシェルスクリプトを記述してから、タスク(または「コマンド」、Symfony2言語で記述します)シェルスクリプトを実行します。私が理解しているように、ORMの目的は反復作業を抽象化することです。Doctrineがそうではないので、Doctrineを図に組み込むことが理にかなっているかわかりません。 tそのタスクをもっと簡単にします。