PHP Activerecord:更新对象数组

时间:2012-02-26 19:25:57

标签: php database activerecord phpactiverecord

以下代码将返回PHP Activerecord个对象的数组:

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

假设程序知道书籍的顺序,我可以继续并更新书籍的属性并将其保存到数据库中,如下所示:

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

为了保存上述内容,我必须在每个对象上调用->save()方法

$book[0]->save();
$book[4]->save();

  1. 有更好的方法吗?内置PHP ActiveRecord功能 保存给定对象数组的所有成员,或基于 协会?

  2. 假设上面$book[4]的原始标题已经'很好 标题',->save()方法会考虑$book[4]更改和 继续数据库保存?

2 个答案:

答案 0 :(得分:2)

尝试使用全部更新

$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"));

我认为这应该更清洁

答案 1 :(得分: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表示一行,并跨表映射行。有这么简单的模型使用的明显限制。

  

对Object属性的任何赋值都会触发'dirty'标志   该属性,以及任何后续更新/保存的调用       即使指定的属性值为,对象也会触发查询       与数据库/模型的先前值相同。调用       没有分配时,save()方法不会触发此操作       查询。