2011-06-23 97 views
3

如何在Doctrine 2中執行原生sql查詢,執行更新語句? EntityManager上的createNativeQuery方法需要第二個參數(ResultSetMapping)才能將結果集映射到對象。doctrine2原生查詢更新語句

但是,當更新(或插入,或設置,或...)沒有resulset映射。 傳遞null或只傳遞新的ResultSetMapping()會產生錯誤。

只有選擇查詢支持原生sql?

回答

1

更新語句通常非常簡單,所以您不妨使用正常的Doctrine2方式(即以編程方式更新實體並使用DQL Updates調用EntityManager :: flush()或OR)。

話雖如此,如果你真的想用正常的SQL,你總是可以做這樣的:

  1. 堅持開發與Doctrine2的連接時,你得到的db connection object

    $連接= \ Doctrine \ DBAL \ DriverManager :: getConnection($ dbConfig-> toArray(),null,$ evm);

  2. 執行任何你想要的SQL,使用在connection對象的可用方法,例如:

    $連接 - >的executeUpdate($的SQL,$參數,可以$類型); $ connection-> exec($ sql); ...

+0

我想在其他領域的一個更新基於該ordening所有的記錄等級字段, 。例如:Set @rank:= 0; INSERT INTO排名(ID,排名)SELECT ID,@rank:= @排名+1排名ORDER BY分數DESC ON DUPLICATE KEY UPDATE排名= @rank;不要認爲使用DQL是可行的嗎? – Sewdn

+1

這是一個不同的問題,我沒有完全理解這個簡短的評論;我建議你提出另一個問題,但提供更多細節。儘管如此,如果您知道如何在SQL中執行UPDATE,那麼您始終可以使用我提供給您的原始問題的答案,這將起作用。 – faken

11

基本上同上W/faken,

這從docs

如果你想執行DELETE,UPDATE或INSERT語句中的原生 SQL API不能使用並可能會引發錯誤。使用 EntityManager#getConnection()訪​​問本地數據庫連接 併爲這些查詢調用executeUpdate()方法。

一個音符使用的是連接對象可以從EntityManager的檢索:

$conn = $entityManager->getConnection(); 
$rowsAffected = $conn->executeUpdate($sql, $params, $types);