Здравствуйте!
Натолкнулся на проблему, которую не могу понять. Ситуация - есть модель товаров, нужно загружать файлы (т.е. несколько файлов) и хранить пути к ним в базе данных. Для этого в модели создал переменную imageFiles, добавил ее в правила. У этой же модели есть переменная $image, которая будет хранить сериализированный массив с путями к картинкам.
Проблема вот в чем. Я сначала создал метод в модели, в котором обходил загруженные файлы ($imageFiles) и сохранял их, попутно сохраняя путь к каждому файлу в отдельный массив. Затем массив сериализировал и присваивал переменной модели, которая соответствует столбцу в БД. Затем сохранял модель ($model->save()).
В результате - файлы загружаются куда нужно, yii выдает ошибку - no such file or directory, указывая на временный файл.
Все начало работать, когда переписал код таким образом, чтобы сперва сохранять модель, затем сохранять файлы на сервер. Но вышло очень коряво и некрасиво. Приходится дважды обходить один и тот же массив. Вот кусок контроллера…
public function actionCreate()
{
$model = new Goods();
$categories = $this->listOfCategories();
if ($model->load(Yii::$app->request->post())) {
$model->imageFiles = UploadedFile::getInstances($model, 'imageFiles');
if ($model->validate()) {
$filePaths=[];
foreach ($model->imageFiles as $file) {
$filePath = '../../common/images/' . $file->baseName . '.' . $file->extension;
$filePaths[] = $filePath;
}
$model->image=serialize($filePaths);
if($model->save()){
foreach ($model->imageFiles as $file){
$filePath = '../../common/images/' . $file->baseName . '.' . $file->extension;
$file->saveAs($filePath);
}
}
}
else {
return false;
}
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
'categories'=>$categories
]);
}
}
А было (но не работало на сохранение модели) вот так. Привожу кусок модели:
public $filePaths = [];
public function upload(){
if ($this->validate()) {
foreach ($this->imageFiles as $file) {
$filePath = '../../common/images/' . $file->baseName . '.' . $file->extension;
$this->filePaths[] = $filePath;
$file->saveAs($filePath);
}
return true;
}
else {
return false;
}
}
Далее в контроллере я этот $filePaths сериализировал и присваивал переменной, которая должна быть сохранена в БД.
Вопрос в следующем - почему так? Почему нельзя сначала сохранить файлы, затем получившийся массив с их путями (там уже лежат просто строки) сохранять в БД?
И как вообще эту проблему решают?