Yii $ this-> save()和$ this-> commit()在循环中使用时仅保存最后一条记录

时间:2014-03-27 07:13:44

标签: php mysql yii

我试图通过Yii中的模型将多个记录插入到我的数据库中。我使用foreach将数据传递给控制器​​的模型。首先,它检查数据库中是否存在该字段,如果结果为false,则插入数据库。但是,在插入时,它不会插入第一条记录,而是插入从控制器末尾传递的记录。但是,只要第一个数据传递给控制器​​,就会生成一个Id。

我的控制器:

foreach($user_likes['data'] as $ul){
    $category_id = $categoriesModel->ifCategoryExists($ul['category']);
    if(!$category_id){
      $category_id = $categoriesModel->add($ul['category']);                        
      $categories[$category_id] = $ul['category'];                          
    }
}

我的模特:

public function add($params = '') {
    $transaction = $this->dbConnection->beginTransaction();
    try {
        $this->Category = $params;
        $this->save();
        $transaction->commit();
        echo "{ inserted_id ", $this->Id," },{ inserted_category ",$params," }<br/>";
        return $this->Id;
    } catch (Exception $e) {
        $transaction->rollback();
        throw $e;
    }
}

当我看到echo

的输出时
{ inserted_id 17 },{ inserted_category Community }
{ inserted_id 17 },{ inserted_category Local business }
{ inserted_id 17 },{ inserted_category Actor/director }
{ inserted_id 17 },{ inserted_category Event planning/event services }
{ inserted_id 17 },{ inserted_category Album }
{ inserted_id 17 },{ inserted_category Magazine }
{ inserted_id 17 },{ inserted_category Internet/software }
{ inserted_id 17 },{ inserted_category Consulting/business services }
{ inserted_id 17 },{ inserted_category Education website }
{ inserted_id 17 },{ inserted_category Author }
{ inserted_id 17 },{ inserted_category Public figure }
{ inserted_id 17 },{ inserted_category Business person }
{ inserted_id 17 },{ inserted_category Public figure }
{ inserted_id 17 },{ inserted_category Community }
{ inserted_id 17 },{ inserted_category Comedian }
{ inserted_id 17 },{ inserted_category Business person }
{ inserted_id 17 },{ inserted_category Public figure }
{ inserted_id 17 },{ inserted_category News personality }
{ inserted_id 17 },{ inserted_category Political organization }
{ inserted_id 17 },{ inserted_category Computers/technology }
{ inserted_id 17 },{ inserted_category Travel/leisure }
{ inserted_id 17 },{ inserted_category Community }

非常奇怪的是,它正在插入

Community

2 个答案:

答案 0 :(得分:2)

CActiveRecord有一个状态,它以“新”开头(并使用“插入”方案)。只要在其上调用save(),它就不再是新的并转到“更新”方案。 CActiveRecord不会插入不同的记录,1个实例= 1行。

但是如果你真的想要使用单个实例,只需重置一下:

$this->Id = NULL;
$this->isNewRecord = TRUE; 

如果您在$this->save()之前添加此权限,它应该有效。 我强烈建议按原样使用框架并创建新实例。

答案 1 :(得分:0)

您正在保存相同的模型,反复使用不同的属性(有关详细信息,请参阅CActiveRecord::save())。我建议您在保存时使用CategoriesModel的新实例或将isNewRecord设置为false并在保存之前取消设置id

public function add($params = '') {
    $transaction = $this->dbConnection->beginTransaction();
    try {
        $this->isNewRecord = false;
        unset($this->Id);
        $this->Category = $params;
        $this->save();
        $transaction->commit();
        echo "{ inserted_id ", $this->Id," },{ inserted_category ",$params," }<br/>";
        return $this->Id;
    } catch (Exception $e) {
        $transaction->rollback();
        throw $e;
    }
}