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)