【问题标题】:PHP Activerecord: updating array of objectsPHP Activerecord:更新对象数组
【发布时间】:2012-03-16 09:57:39
【问题描述】:

以下代码将返回一个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]的原标题已经是'Nice 标题',->save() 方法是否会考虑 $book[4]changed 和 继续保存数据库吗?

【问题讨论】:

    标签: php database activerecord phpactiverecord


    【解决方案1】:

    尝试使用 update all 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"));
    

    我认为这应该更干净

    【讨论】:

    • 您的示例假设只有一本书,而 OP 有多本书。
    • 那是正确的@Navarr,我有一个表单,用户可以在其中更新多个对象的多个属性,在表单提交时调用 save() 方法 10-15 次,在我看来似乎有点矫枉过正,效率不高,数据库/资源​​方面
    • 感谢@Navrr 的观察...更新了代码。事实上,仍然使用 update_all 有助于保存重复的 save()
    • 我看不出有什么区别,用两个 update_all 方法替换为 save() 方法。
    【解决方案2】:

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

    没有这样的 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() 方法不会触发此操作 查询。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 2023-03-04
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2021-07-08
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多