PHP Activerecord:更新对象数组

PHP Activerecord:更新对象数组,php,database,activerecord,phpactiverecord,Php,Database,Activerecord,Phpactiverecord,以下代码将返回一个对象数组: 假设程序知道书籍的顺序,我可以继续更新书籍的属性,并将它们保存到数据库中,如下所示: $book[0]->title = 'my first book'; $book[0]->author = 'Danny DeVito'; $book[4]->title = 'Nice Title'; 为了保存上述内容,我必须对每个对象调用->save()方法 $book[0]->save(); $book[4]->save(); 有更好的方法

以下代码将返回一个对象数组:

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

$book[0]->title = 'my first book';
$book[0]->author = 'Danny DeVito';
$book[4]->title = 'Nice Title';
为了保存上述内容,我必须对每个对象调用
->save()
方法

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

  • 有更好的方法吗?内置函数 保存给定对象数组的所有成员,或基于 联想

  • 假设上面的
    $book[4]
    的原始标题已经是“不错的” 标题,“<代码> -> SAVE())/>代码>方法考虑<代码> $Boo[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模型的设计背道而驰,因为对象表示一行,并跨表映射行。使用如此简单的模型有一个明显的局限性

    对对象属性的任何赋值都会在 该属性,以及任何后续更新/保存该属性的调用 对象将触发查询,即使指定的属性值为 与数据库/模型的上一个值相同。调用 未进行任何赋值时的save()方法不会触发此错误 查询。


    您的示例假设只有一本书,因为OP有多本书。这是正确的@Navarr,我有一个表单,用户可以在多个对象上更新多个属性,在表单提交时调用save()方法10-15次在我看来似乎有些过火,效率不高,数据库/资源明智感谢@Navrr的观察。。。更新了代码。事实上,仍然使用update_all有助于保存重复的save()我看不出有什么区别,用两个update_all方法替换to save()方法。
    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)