示例:我们有一个测试表,它有 3 列:id、watchers、title。 我们有一个代码:
$test = Test::model()->findByPk(1);
echo $test->watchers; // 0
$test->title = 'another';
$test->save();
当我们调用 save() 时,ir 会生成 sql 查询,例如 “UPDATE test SET title='another', watchers='0' WHERE id='1'”
。所以,看起来一切都很好。但问题是,如果其他进程在当前脚本中的 findByPk 和 save 之间更新 watchers 变量,则代码将生成错误的值。所以:
$test = Test::model()->findByPk(1);
echo $test->watchers; // 0
$test->title = 'another';
//HERE WE HAVE A CODE WHICH PERFORMS FOR 1 SECOND. MEANWHILE ANOTHER PROCESS
// UPDATES TABLE WITH WATCHERS = 1
$test->save();
所以,这段代码会将记录的 watchers 字段保存回 0。如何克服这个问题?为什么 Yii ORM 不仅保存更改的值?为什么它试图保存所有值?谢谢。
最佳答案
由于您获取了 $test
中的每个值,因此当您执行 $test->save();
时,每个属性都会使用新记录或之前的值保存包含。
当您查询 $test = Test::model()->findByPk(1);
时,$test->watchers;
将与之前的值相同当您执行查询时,只有当您执行另一个 select
查询时,该值才会更改(如果观察者的值被另一个 update
查询更改)。希望这是有道理的:P
您可以尝试以下更新方法:
Test::model()->updateByPk(1, array(
'title' => 'another'
));
这将执行以下查询:
UPDATE `test` SET `title`=:yp0 WHERE `test`.`id`=1.
Bound with :yp0='another'
关于php - 如何在 Yii 中保存数据并确保正确保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32990274/