Почему не сохраняются пути к картинкам в базе данных?

166
11 декабря 2018, 09:40

yii2-advanced, сохраняю картинки.

На диск, в нужный каталог и под нужным именем копируются нормально, но в базу не сохраняются. Почему так? Контроллер:

 public function actionCreate(){
    $model = new Products();
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        if ($model->create()) {
            if ($model->save()){
                $model->loadImages();
            }
        }
        return $this->redirect(['view', 'id' => $model->id]);
    }
    return $this->render('create', [
        'model' => $model,
    ]);
}

Метод для загрузки:

public function loadImages(){
    $this->image =  UploadedFile::getInstances($this, 'image');
    if ($this->image && $this->validate()){
        $dir = "uploads/products/$this->name";
        if(!file_exists($dir)){
            mkdir($dir);
            chmod($dir, 1777);
        }
        foreach ($this->image as $i => $images){
            $model = new Images();
            $model->name =  "$dir/$i.$images->extension";
            $model->save();
            $model->num = $i;
            $model->users_id = Yii::$app->user->id;
            $model->products_id = $model->id;
            $images->saveAs($model->name);
        }
    }
}

Представление (ничего особенного, только поля формы):

<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'price')->textInput() ?>
<?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'bar_code')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'vendor_code')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'count')->textInput() ?>
<?= $form->field($model, 'image[]')->fileInput(['multiple' => true]) ?>
<?= $form->field($model, 'fabricators_id')->dropDownList(Fabricators::getParam('name')) ?>
Answer 1

Замени на: $model->name = "$dir/$i.".$images->extension;

в базе ещё тип данных на поле name - надо text поставить

Answer 2
        $model = new Images();
        $model->name =  "$dir/$i.$images->extension";
        $model->save();
        $model->num = $i;
        $model->users_id = Yii::$app->user->id;
        $model->products_id = $model->id;
        $images->saveAs($model->name);

А это нормально не проверять сохранилась ли модель, и сохранять ее перед тем, как запишешь в нее все?

Всегда проверяйте перед сохранением

if($model->save(){} 
else{// отлов ошибок}
Answer 3

Нашел ошибку: проблема была в моей невнимательности.

$model->products_id = $model->id; 

должно было быть

$model->products_id = $this->id

Поля у модели картинок - required, а т.к. products_id получал пустое значение (модель не сохранена, в базе автоинкрементация), то и сохранять картинки она не собиралась.

Помогло использование var_dump

Вот так выглядит рабочий код (может кому-нибудь будет интересно...):

public function loadImages(){
    $this->image =  UploadedFile::getInstances($this, 'image');
    if ($this->image && $this->validate()){
        $dir = "uploads/products/$this->name";
        foreach ($this->image as $i => $images){
            $model = new Images();
            $model->name = "$dir/$i.$images->extension";
            $model->num = $i;
            $model->users_id = Yii::$app->user->id;
            $model->products_id = $this->id;
            if($model->save()){
                if(!file_exists($dir)){
                    mkdir($dir);
                    chmod($dir, 1777);
                }
                $images->saveAs($model->name);
            }
        }
    }
}
READ ALSO
0100 в 100 числовые значения

0100 в 100 числовые значения

Подскажите пожалуйста, в функцию попадает число, с ним внутри происходят математические операции, есть ли способ из числа 0100 получить 100 не прибегая...

153
Повторяющиеся значения soap wsdl

Повторяющиеся значения soap wsdl

я создаю веб-сервис для отправки данных - soap вместе с wsdl

194
Не работает часть сайта из за php кода

Не работает часть сайта из за php кода

Не работает часть сайта из за php кода на хостинге 000webhostcom

149