Yii2多文件上传成功但仅首个文件信息存入数据库求助
解决Yii2多文件上传仅首个文件存入数据库的问题
这个问题的核心原因很明确:你在循环中一直复用同一个Resource3d模型实例,导致后续的save()操作其实是在更新第一条插入的记录,而不是创建新的记录。
问题分析
第一次循环时,$model->save()会向数据库插入1.jpg的记录;第二次循环你修改了$model的path和name为2.jpg的信息,再调用save()时,因为模型已经有了主键(从第一次插入获得),Yii会执行更新操作,把第一条记录改成2.jpg的信息;第三次循环同理,最终数据库里只会留下最后一个文件的记录(你看到的是1.jpg可能是调试时的特殊情况,但本质逻辑是错误的)。
修复方案
在foreach循环内部,每次创建一个新的Resource3d实例,让每个文件对应一条新的数据库记录。修改后的控制器代码如下:
public function actionCreate() { $model = new Resource3d(); if ($model->load(Yii::$app->request->post())) { $model->files = UploadedFile::getInstances($model, 'files'); foreach ($model->files as $file){ // 为每个文件新建一个模型实例 $newModel = new Resource3d(); // 如果你的表单还有其他需要提交的字段(比如分类、描述等),记得复制原模型的对应值 // 示例:$newModel->category_id = $model->category_id; $file->saveAs('uploads/resource3d/' . $file->baseName . $file->extension); $newModel->path = '../web/uploads/resource3d/'. $file->baseName . $file->extension; $newModel->name = $file->baseName; // 可选:添加错误调试,方便排查保存失败的问题 if (!$newModel->save()) { var_dump($newModel->errors); exit; } } return $this->redirect(['index']); } else { return $this->render('create', [ 'model' => $model, ]); } }
模型代码说明
你的模型代码基本无需修改:
public $files;用于接收多文件上传的实例rules()里的['files', 'file', 'skipOnEmpty' => false, 'maxFiles' => 0]配置正确,maxFiles => 0表示允许上传任意数量的文件。
内容的提问来源于stack exchange,提问作者Sao Ho
相关产品推荐
相关产品推荐

