2011-06-06 85 views
1

比方說,我有一個名爲->saveAll()的類方法。這個類跟蹤要放入數據庫的對象。 (像什麼學說)高效的數據庫與跟蹤器/ persist的交互

什麼是有效的方式來保存這些對象?這就是我現在想的(我將以MySQL爲例):

  1. 打開與MySQL的連接。
  2. 對所有對象執行循環。
  3. 檢查哪個屬性發生了變化。
  4. UPDATEINSERT執行查詢。
  5. 當循環結束時,關閉連接。

這是最好的辦法嗎?還是有更好的方法來做到這一點?如果我想要->saveOne($object)。將下面好:

  1. 打開連接
  2. 檢查屬性更改
  3. 進行查詢
  4. 緊密結合
+1

如何提供一個自定義的_toString()函數來返回這個對象持有的數據然後你只需要不必做任何事情並且自動調用_toString()將每個對象調用並且你可以對數據做任何事 – 2011-06-06 15:46:16

+0

你的意思是'__toString'會生成一個SQL查詢? – Pwnna 2011-06-06 16:43:57

回答

1

如果你的表中有一個主鍵或唯一索引,你可以同時使用一個REPLACE statement與您的所有數據:

REPLACE INTO foo (id, bar) VALUES (NULL, 'baz'), (1, 'hello'); 

如果該行不存在或未指定主鍵/唯一索引,則該行將被插入。如果找到主鍵或唯一索引,它將被更新。另外,當MySQL執行UPDATE(或通過REPLACE進行更新時)時,它將檢查每個值是否已自動更改(無需自己執行)並保持原樣(如果它沒有)沒有任何額外的操作。

+0

這是最有效的方式來做到這一點,也見編輯。 – Pwnna 2011-06-06 16:44:30

+0

我會說是的。您不必INSERT或更新。您不必檢查屬性是否已更改(使用額外的SELECT查詢),因爲MySQL將爲您執行此操作。您可以在單個查詢中完成所有操作。您也可以一次更新多行(與UPDATE不同)。 – netcoder 2011-06-06 16:56:35

+0

等待如何用'REPLACE'一次更新多行?是僅MySQL特性還是其他數據庫也支持它(我試圖通過簡單的數據庫抽象接口來支持多個數據庫後端)。 – Pwnna 2011-06-06 17:14:34