1

如果以前未插入值,我想更新表中的值。这是我的代码-

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();
}

但即使我提供了日期条件,它也会继续插入重复值。为什么?如何更新而不插入重复值?

4

2 回答 2

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);
于 2013-07-10T22:20:23.807 回答
2

这就是我通常这样做的方式:

$myModel = myModel::model()->findByAttributes(array('atr1'=>$atr1, 'atr2'=>$atr2));
if($myModel == null){
//create and save new reccord
}

我不确定这是否是最好的方法,或者 Yii 是否有更好的方法,但它确实有效。

于 2013-07-10T22:20:10.900 回答