2011-06-23 21 views
3

Doctrine 2でネイティブSQLクエリを実行し、更新ステートメントを実行する方法は? EntityManagerのcreateNativeQueryメソッドは、結果セットをオブジェクトにマップできるようにするために、2番目のパラメータ(ResultSetMapping)を必要とします。doctrine2ネイティブクエリの更新ステートメント

しかし、更新する(または挿入する、または設定する、または...)ときにマップする予定がない。 nullを渡すか、まったく新しいResultSetMapping()を渡すと、エラーが発生します。

ネイティブSQLでは選択クエリのみがサポートされていますか?

答えて

1

更新ステートメントは、通常、Doctrine2の通常の方法(プログラムでエンティティを更新し、EntityManager :: flush()を呼び出すこと、またはDQL Updatesを使用して)を使用することもできます。

あなたが本当に通常のSQLを使用したい場合、あなたは常にこのようにそれを行うことができ、これを言った:

を$接続:

  1. db connection object Doctrine2との接続を作成するときに取得してください= \ Doctrine \ DBAL \ DriverManager :: getConnection($ dbConfig-> toArray()、null、$ evm);

  2. connectionオブジェクトで利用可能な方法を使用して、あなたが好きなSQLを実行し、例えば:

    $ Connection(接続) - > ConnectのexecuteUpdate($ sqlを、$ paramsは、$タイプ)。 $ connection-> exec($ sql); ...

+0

私は他の分野の一つにordeningに基づいてレコードのすべてのためのランクフィールドを、更新したいです。何かが好きです:Set @rank:= 0; INSERT INTOランク付け(ID、ランク)SELECT id、@rank:= @ rank + 1ランク付けされたORDER BYスコアでDESCを重複キー更新ランク= @rank;それがDQLを使って可能になるとは思わない? – Sewdn

+1

それは別の質問です。私はそのような短いコメントで完全に理解していません。私はそれを求める別の質問を開くことを提案しますが、詳細を提供してください。それでも、SQLでこのUPDATEを実行する方法がわかっている場合は、元の質問に提供した回答をいつでも使用することができます。 – faken

11

基本的に同上のワット/ faken、docsから

この:

あなたはDELETE、UPDATEまたはINSERT文を実行したい場合は、ネイティブ SQL APIがすることはできませんおそらくエラーが発生します。 EntityManager#getConnection()を使用してネイティブデータベース接続 にアクセスし、これらのクエリに対してexecuteUpdate()メソッドを呼び出します。使用の

1つのノートでは、接続オブジェクトがのEntityManagerから取得することができます:

$conn = $entityManager->getConnection(); 
$rowsAffected = $conn->executeUpdate($sql, $params, $types); 
関連する問題