2012-02-26 73 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