Search code examples
yii2yii2-basic-app

Yii2 upload multiple success but save only first value to database


I'm coding a multiple upload function for my website. The upload was successful. But it's only save the first value to my database. Example i upload 3 files name 1.jpg, 2.jpg, 3.jpg. Then it will upload the 3 files successfully but save only the 1.jpg's name to database.

My controllers

public function actionCreate()
{
    $model = new Resource3d();

    if ($model->load(Yii::$app->request->post())) {
        $model->files = UploadedFile::getInstances($model, 'files');  

        foreach ($model->files as $files){

            $files->saveAs('uploads/resource3d/' . $files->baseName . $files->extension); 
            $model->path = '../web/uploads/resource3d/'. $files->baseName . $files->extension;      
            $model->name =  $files->baseName;   
            $model->save();          

        }

        return $this->redirect(['index']);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

My models:

public $files;
public function rules()
{
    return [
        [['name', 'path'], 'string', 'max' => 255],
        [['files'], 'file', 'skipOnEmpty' => false, 'maxFiles' => 0],
    ];
}

Please help.

Thank you.


Solution

  • You are creating single object of your model Resource3d. You need to create multiple object if you want to save multiple records.

    Try this :

    public function actionCreate()
    {
        $model = new Resource3d();
    
        if ($model->load(Yii::$app->request->post())) {
            $model->files = UploadedFile::getInstances($model, 'files');  
    
            foreach ($model->files as $files){
                $res_model = new Resource3d();
                $res_model->load(Yii::$app->request->post());
                $files->saveAs('uploads/resource3d/' . $files->baseName . $files->extension); 
                $res_model->path = '../web/uploads/resource3d/'. $files->baseName . $files->extension;      
                $res_model->name =  $files->baseName;   
                $res_model->save();          
            }
    
            return $this->redirect(['index']);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }
    

    This is just an example, change it according to your need.