如果先前未插入值,我想更新表格中的值。这是我的代码 -
function save_data($date, $game, $score) {
$criteria = new CDbCriteria;
$criteria->addCondition("date = '{$date}'");
$data = array("date" => $date,
"game" => $game,
"score" => $score);
$game_report = new GameReport();
$game_report->attributes = $data;
$game_report->save();
}
但即使我提供了日期条件,它也会继续插入重复值。为什么?如何更新并不插入重复值?
答案 0 :(得分:4)
要进行更新,您需要在已加载的数据库模型上执行此操作。 在您的情况下,可以这样做:
function save_data($date, $game, $score) {
$criteria = new CDbCriteria;
$criteria->addCondition("date = '{$date}'");
$data = array(
"date" => $date,
"game" => $game,
"score" => $score
);
$game_report = GameReport::model()->findByAttributes($data);
if (empty($game_report)) {
$game_report = new GameReport();
}
$game_report->attributes = $data;
$game_report->save();
}
另外,为了避免sql注入,你应该绑定你的条件参数,如:
$criteria->addCondition("date = :d");
$criteria->params[':d'] = $date;
或简单地说:
$criteria->compare('date', $date);
答案 1 :(得分:2)
这就是我通常这样做的方式:
$myModel = myModel::model()->findByAttributes(array('atr1'=>$atr1, 'atr2'=>$atr2));
if($myModel == null){
//create and save new reccord
}
我不确定这是否是最佳方式,或者如果Yii有更好的方法,但它有效。