【问题标题】:Yii2 - foreach loop to save all files path in database modelYii2 - foreach 循环保存数据库模型中的所有文件路径
【发布时间】:2015-07-12 14:00:18
【问题描述】:

您好,

我在 Yii2 中使用多文件上传输入。 multiole 文件输入很好地保存了在名为 audio 的文件夹中选择的文件。 问题是我无法在 foreach 循环中将数据库模型 Faixas.php 中每个文件的名称和路径保存在名为 ficheiro 的字段中。

这是我的代码:

控制器:

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

    if (Yii::$app->request->isPost) {
        $model->files = UploadedFile::getInstances($model, 'files');
        if ($model->upload()) {
            return $this->render('create', ['model' => $model]);
        }
    }

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

模型作为一个名为 upload() 的函数将文件保存在文件夹中,但要保存在模型中的部分->ficheiro 不起作用(不明白吗?):

public function rules()
{
    return [
        [['nome', 'ficheiro', 'dummy1', 'dummy2', 'dummy3', 'dummy4', 'dummy5'], 'string', 'max' => 255],
        [['files'], 'file', 'skipOnEmpty' => false, 'extensions' => 'mp3, ogg, webm', 'maxFiles' => 30],
    ];
}

public function upload()
{   
    $model = new Faixas();
    if ($this->validate()) { 
        foreach ($this->files as $file) {
                $file->saveAs('audio/' . $file->baseName . '.' . $file->extension);

                // this part in not working, why ????
                $filePath = 'audio/'  . $file->baseName . '.' . $file->extension;
                $model->ficheiro = $filePath;
                $model->save();
    }
        return true;
    } else {
        return false;
    }
}

最后是渲染输入的视图:

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

<?= $form->field($model, 'files[]')->fileInput(['multiple' => true, 'accept' => 'audio/*']) ?>

<button>Submit</button>

有什么想法可以完成吗? 非常感谢...

整个 Faixas.php 模型类:

   <?php

namespace app\models;

use Yii;

/**
* This is the model class for table "faixas".
*
* @property integer $id
* @property string $nome
* @property string $ficheiro
* @property string $dummy1
* @property string $dummy2
* @property string $dummy3
* @property string $dummy4
* @property string $dummy5
*/
class Faixas extends \yii\db\ActiveRecord
{
  /**
   * @inheritdoc
   */
 public static function tableName()
{
    return 'faixas';
}

public $files;

/**
 * @inheritdoc
 */
public function rules()
{
    return [
        [['nome', 'ficheiro', 'dummy1', 'dummy2', 'dummy3', 'dummy4', 'dummy5'], 'string', 'max' => 255],
        [['files'], 'file', 'skipOnEmpty' => false, 'extensions' => 'mp3, ogg, webm', 'maxFiles' => 30],
    ];
}

public function upload()
{   

    if ($this->validate()) { 
        foreach ($this->files as $file) {
                $file->saveAs('audio/' . $file->baseName . '.' . $file->extension);
                $model = new Faixas();
                // this part in not working, why ????
                $filePath = 'audio/'  . $file->baseName . '.' . $file->extension;
                $model->ficheiro = $filePath;
                $model->save();
    }
        return true;
    } else {
        return false;
    }
}

/**
 * @inheritdoc
 */
public function attributeLabels()
{
    return [
        'id' => Yii::t('app', 'ID'),
        'nome' => Yii::t('app', 'Nome'),
        'ficheiro' => Yii::t('app', 'Ficheiro'),
        'dummy1' => Yii::t('app', 'Dummy1'),
        'dummy2' => Yii::t('app', 'Dummy2'),
        'dummy3' => Yii::t('app', 'Dummy3'),
        'dummy4' => Yii::t('app', 'Dummy4'),
        'dummy5' => Yii::t('app', 'Dummy5'),
    ];
}

// coloca o Audio na GridView
public function getAudio()
{
    return \Yii::$app->request->BaseUrl.'/'.$this->ficheiro;
}

}

【问题讨论】:

    标签: file foreach model path yii2


    【解决方案1】:

    看来您是在 wrog 地方创建模型的。您在循环外创建一个$model = new Faixas();。尝试在里面创建。

    public function upload()
    {   
    
      if ($this->validate()) { 
        foreach ($this->files as $file) {
                $file->saveAs('audio/' . $file->baseName . '.' . $file->extension);
    
                $model = new Faixas(); 
    
    
                $filePath = 'audio/'  . $file->baseName . '.' . $file->extension;
                $model->ficheiro = $filePath;
                $model->save();
        }
        return true;
      } else {
        return false;
      }
    }
    

    【讨论】:

    • 它没有用。 $model->ficheiro 继续为空。 :( 感谢您的尝试。
    • 它在视图上方。只有2个主要功能。您需要查看所有文件吗?
    • 你提到了数据库模型,我需要检查所有Faixas类模型,不仅是上传功能和规则
    • 如果可以,请检查分配后的内容 $model->ficheiro `$model->ficheiro = $filePath;` 如果不是空的,问题可能在[['files'], 'file',...... 规则中,否则为空问题可能出在文件分配中(在创建操作中)..
    • 我不得不离开电脑,但稍后我会回来。非常感谢。
    【解决方案2】:

    已解决...从模型文件中删除规则:

    [['files'], 'file', 'skipOnEmpty' => false, 'extensions' => 'mp3, ogg, webm', 'maxFiles' => 30],

    现在 foreach() 循环将每个文件路径保存在数据库中。

    非常感谢所有试图以某种方式实现解决方案的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多