我想在INSERT OR UPDATE IF EXISTS
在一個事務中。實施「更新如果存在」在學說ORM
在mysql的,我一般會用DUPLICATE KEY
(「UPDATE ON重複密鑰。」)我知道很多的解決方案,利用各種SQL的變體和子查詢這個問題,但我想實現這個在學說(PHP的ORM)。看來會有這樣做的Doctrine方法,因爲它是如此功能包裝,但我沒有找到任何東西。出於某種原因,使用PHP ORM軟件包會出現這種問題嗎?還是任何學說專家知道如何通過黑客或任何手段來實現這一點?
我想在INSERT OR UPDATE IF EXISTS
在一個事務中。實施「更新如果存在」在學說ORM
在mysql的,我一般會用DUPLICATE KEY
(「UPDATE ON重複密鑰。」)我知道很多的解決方案,利用各種SQL的變體和子查詢這個問題,但我想實現這個在學說(PHP的ORM)。看來會有這樣做的Doctrine方法,因爲它是如此功能包裝,但我沒有找到任何東西。出於某種原因,使用PHP ORM軟件包會出現這種問題嗎?還是任何學說專家知道如何通過黑客或任何手段來實現這一點?
學說支持REPLACE INTO
使用replace()
方法。這應該與您所尋找的ON DUPLICATE KEY UPDATE
完全一樣。
REPLACE的唯一問題似乎是它會丟棄,然後創建一個新行(而不是執行實際的UPDATE),從而刪除自動增量ID(在此案件,我的主要身份證)。我在這裏錯過了什麼嗎? 例如 - 我的自動增量ID爲9,但計數爲3000.當我執行REPLACE INTO第9行,新行ID爲3001. – seans 2009-07-15 17:51:50
我能想到的唯一的事情就是先查詢實體,如果它存在,否則創建新的實體。
if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/))
{
$entity = new Foo();
}
/*do logic here*/
$entity->save();
根據https://www.vivait.co.uk/labs/updating-entities-when-an-insert-has-a-duplicate-key-in-doctrine這可以通過$entityManager->merge()
來實現。
$entity = new Table();
$entity->setId(1);
$entity->setValue('TEST');
$entityManager->merge($entity);
$entityManager->flush();
我已經開始使用插件來實現此功能。它仍處於早期階段,但經過測試並用於我的用例。它可在以下網址獲得:https://github.com/m14t/m14tDoctrineRecordPlugin歡迎使用測試用例,錯誤報告和拉取請求。 – m14t 2012-04-19 07:39:27
我認爲你應該將@ pix0r的答案標記爲解決方案 – Mojtaba 2016-10-11 20:01:40