2012-02-26 77 views
2

下面的代碼將返回PHP Activerecord對象的數組:PHP的ActiveRecord:對象的更新陣列

$book = Book::find('all'); 

假設程序是知道書的順序,我可以繼續和更新的書籍屬性和保存他們到數據庫如下:

$book[0]->title = 'my first book'; 
$book[0]->author = 'Danny DeVito'; 
$book[4]->title = 'Nice Title'; 

爲了節省上述我必須調用->save()方法的每個對象

012上
  1. 有沒有更好的方式來做到這一點?內置PHP ActiveRecord函數 保存給定的對象數組中的所有成員,還是基於 關聯?

  2. 假設$book[4]上述原題已經「很高興 標題」,將在->save()方法考慮$book[4]改變, 繼續與數據庫保存?

回答

1

大量的研究後,我決定後我的結論/回答:

有沒有這樣的ActiveRecord庫函數可以更新具有唯一值的對象數組 梅毒。

假設的ActiveRecord要拍一個更新請求,它應該是這樣的:

UPDATE books 
    SET title = CASE id 
     WHEN 0 THEN 'my first book' 
     WHEN 4 THEN 'Nice Title' 
    END, 
    author = CASE id 
     WHEN 0 THEN 'Danny DeVito' 
    END 
WHERE id IN (0,4) 

同樣的問題爲「我怎麼會在一次更新有着不同的價值觀多行」。這將違背Activerecord模型的設計,因爲Object表示一行,並將行映射到表中。有這樣一個簡單的模型可以工作的一個明顯的限制。

任何分配給一個對象的屬性會觸發 一個「髒」標誌,該標誌的屬性,任何後續調用更新/保存 對象將觸發查詢即使分配的屬性值是 一樣數據庫/模型的先前值。沒有分配時調用 save()方法不會觸發此 查詢。

1

嘗試使用更新所有insted的

$update = array(); 
$update['title'] = 'my first book'; 
$update['author'] = 'Danny DeVito' ; 

$book[0]->update_all(array('set' =>$update)); 
$book[4]->update_all(array('set' =>array("title"=>"Nice Title")); 

我想這應該是清潔

+0

你的例子假設只有一本書,其中OP有多本書。 – Navarr 2012-02-26 19:51:21

+0

這是正確的@Navarr,我有一個表單,用戶可以跨多個對象更新多個屬性,在表單提交上調用save()方法10-15次似乎是矯枉過正而且效率不高,數據庫/資源​​明智的 – Hamad 2012-02-26 19:58:21

+0

謝謝爲觀察@Navrr ...更新了代碼。事實是仍然使用update_all有助於保存重複的save() – Baba 2012-02-26 20:14:48