在yii中上传多个图像时只保存一条记录

时间:2013-12-23 04:00:44

标签: php mysql yii

图片上传控制器:

if (isset($_POST['Tblvehicleimage'])) {
  $company = Tbluser::model()->findByAttributes(array('user_code' => Yii::app()->user->ID));
  $images = CUploadedFile::getInstancesByName('image');
  if (isset($images) && count($images) > 0) {
    $line = 0;
    foreach ($images as $image => $pic) {
      $line = $line + 1;
      if ($pic->saveAs(Yii::getPathOfAlias('webroot') . '/images/' . $pic->name, 0777)) {
        $model = new Tblvehicleimage;
        $model->attributes = $_POST['Tblvehicleimage'];
        $model->company_code = $company->company_code;
        $model->line_no = $line;
        $model->image = $pic->name;
        $model->save();
      }
    }
    $this->redirect(array('view', 'company_code' => $model->company_code, 'serial_no' => $model->serial_no, 'line_no' => 1));
  }
$this->render('upload', array('model' => $model));
} 

形式:

<div class="row">
    <?php echo $form->labelEx($model,'image'); ?>
  <?php
      $this->widget('CMultiFileUpload', array(
         'model'=>$model,
         'name'=>'image',
         'attribute'=>'image',
         'accept'=>'jpg|gif|png',
        ));
    ?>

这只保存第一个文件,行号为1.我想用第2行保存第二个图像,依此类推。任何人都可以解释控制器中缺少的东西吗?

2 个答案:

答案 0 :(得分:2)

你需要在你的代码中再添加两行,这些行可能对你有所帮助......每次循环移动到下一次迭代时你需要告诉它一条新记录,所以为它添加这一行

$model->isNewRecord=TRUE;

然后如果表中有一个自动递增的主键,则需要将其设置为null。假设ID是表格中的主键,那么你需要这样做

$model->ID=NULL;

所以你的最终代码会变成这样的

$model->company_code=$company->company_code;
$model->line_no= $line;
$model->image = $pic->name;
$model->ID=NULL;
$model->isNewRecord=TRUE;
$model->save();

注意:我认为 line_no 是您表格中的主键。所以如果你的表中是自动增量,你不需要每次都设置它的值。只需将其设置为空。

答案 1 :(得分:1)

您的问题是您正在为迭代重复使用相同的变量$ model。存储在$ model中的值不会被重置,因此,正如@ let-me-see所描述的那样,一旦保存了记录,它就不再是新记录,因此在下一次迭代中它将不会被保存。一个简单的方法是在迭代结束之前完成使用变量$ model后简单unset。您的迭代循环变为

if ($pic->saveAs(Yii::getPathOfAlias('webroot') . '/images/' . $pic->name, 0777)) {
        $model = new Tblvehicleimage;
        $model->attributes = $_POST['Tblvehicleimage'];
        $model->company_code = $company->company_code;
        $model->line_no = $line;
        $model->image = $pic->name;
        $model->save();
        unset($model);//Destroys $model, so your next use will start from a 
            //fresh, empty variable.
      }