PHP Activerecord:更新对象数组


PHP Activerecord: updating array of objects

以下代码将返回一个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],以及是否继续保存数据库?

尝试使用更新所有指令的

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

我认为这应该是更干净的

经过大量研究,我决定发布我的结论/答案:

没有这样的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()方法在未进行赋值时不会触发此查询