Почему модель может не сохранять данные когда валидация пройдена?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.28, 19:00

SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "link" violates not-null constraint
DETAIL: Failing row contains (13, null, null, null, null).
The SQL being executed was: INSERT INTO "loyality_program" DEFAULT VALUES RETURNING "id"

такая ошибка возникает в момент сохранения, поля пусты..

Код

Код: Выделить всё

public function save($runValidation = true, $attributeNames = null){
        \Yii::$app->db->createCommand("Insert into loyality_program (image, link, video, text) VALUES (:image, :link, :video, :text);",
             [
                 ":image" => $this->image,
                 ":link" => $this->link,
                 ":video" => $this->video,
                 ":text" => $this->text,
             ])->execute();
Сохраняет данные модели в базу, но это костыль. Подскажите в чем может быть проблема сохранения через $model->save()


someweb
Сообщения: 541
Зарегистрирован: 2017.03.09, 10:12

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение someweb » 2019.01.29, 08:49

Может загружаете в один экземпляр, а сохранить пытаетесь другой.
Код action и модели выложите.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 09:55

Модель

Код: Выделить всё

<?php

namespace backend\models;

use yii\web\UploadedFile;

class UploadForm extends \yii\db\ActiveRecord
{
    /**
     * @var UploadedFile
     */
    public $image;

    public $imageFile;

    public $video;

    public $link;

    public $text;

    public static function tableName()
    {
        return 'loyality_program';
    }

    public function attributeLabels()
    {
        return [
            'imageFile' => 'Загрузить изображение',
            'image' => 'Изображение',
            'video' => 'Видео',
            'link' => 'Ссылка',
            'text' => 'Текст',
        ];
    }
}

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 09:56

Контролер

Код: Выделить всё

<?php

namespace backend\controllers;

use Yii;
use yii\web\Controller;
use yii\filters\AccessControl;
use backend\models\UploadForm;

class ImagesController extends Controller
{

    public function behaviors()
    {
        return [
          //  'UploadBehavior' => UploadBehavior::className(),
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionIndex()
    {

        $model = new UploadForm();

        if (Yii::$app->request->isPost) {

            $model->load(Yii::$app->request->post(), "UploadForm");
            $model->save();
        }

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

Аватара пользователя
maleks
Сообщения: 1764
Зарегистрирован: 2012.12.26, 12:56

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение maleks » 2019.01.29, 10:16

А у вас не настроена никакая валидация
Поэтому метод load не грузит в модель ничего

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 10:31

валидация была настроена, я ее уже удалил в процессе поиска решения проблемы.
Вместо load теперь такой код
$post = \Yii::$app->request->post()["LoyalityProgram"];
$model->image = $post['image'];
$model->text = $post['text'];
$model->link = $post['link'];
$model->video = $post['video'];

но это не помогло сохранить данные

someweb
Сообщения: 541
Зарегистрирован: 2017.03.09, 10:12

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение someweb » 2019.01.29, 10:40

для начала верните валидацию и сделайте стандартное сохранение.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.

Loveorigami
Сообщения: 974
Зарегистрирован: 2014.08.27, 21:54

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение Loveorigami » 2019.01.29, 10:43

Если от ActiveRecord, то свойства, что есть в бд, из модели убери

Код: Выделить всё

    
    /**
     * @var UploadedFile
     */
    public $image;
    public $imageFile;
    public $video;
    public $link;
    public $text;
в частности - link

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 10:45

вернул
public function rules()
{
return [
[['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, jpeg'],
['image', 'string', 'max' => 255],
['video', 'string', 'max' => 255],
['link', 'string', 'max' => 255],
['text', 'string', 'max' => 255],
];
}
Если от ActiveRecord, то свойства, что есть в бд, из модели убери
Unknown Property – yii\base\UnknownPropertyException
Setting unknown property: backend\models\UploadForm::imageFile

Аватара пользователя
maleks
Сообщения: 1764
Зарегистрирован: 2012.12.26, 12:56

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение maleks » 2019.01.29, 10:47

acidflash писал(а):
2019.01.29, 10:45
Setting unknown property: backend\models\UploadForm::imageFile
ну вот эти дополнительные поля оставь, а для столбцов из базы - убери.

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 10:58

Спасибо, помогло, "чудесный" фреймворк

Аватара пользователя
Alexum
Сообщения: 669
Зарегистрирован: 2016.09.26, 10:00

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение Alexum » 2019.01.29, 11:19

acidflash писал(а):
2019.01.29, 10:58
Спасибо, помогло, "чудесный" фреймворк
Три года работаете с данным фреймворком и не знаете азов ActiveRecord и валидации. С таким подходом для вас любой фреймворк будет "чудесным".

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 11:23

теперь эти азы мне надолго запомнятся

Loveorigami
Сообщения: 974
Зарегистрирован: 2014.08.27, 21:54

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение Loveorigami » 2019.01.29, 12:11

Те поля нужны, если б ты наследовался от yii\base\Model для класса, выполняющего роль формы с валидацией.
Фреймворк удобный - не надо писать вручную 100500 свойств, что есть в бд. А только те, которых нет.

acidflash
Сообщения: 83
Зарегистрирован: 2015.09.03, 19:37

Re: Почему модель может не сохранять данные когда валидация пройдена?

Сообщение acidflash » 2019.01.29, 13:57

Всем спасибо, извините за эмоции.

Ответить