В таблицу записываются пустые строки вместо NULL

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

В таблицу записываются пустые строки вместо NULL

Сообщение azz »

Понимаю что избитая тема. Долго гуглил, но так и не понял почему у меня именно так.

Есть таблица, с типами varchar и дефолтным значением NULL. При создании записи через Active Record вместо NULL я получаю в базе пустые поля. Начал искать, нашел рекомендацию в валидации дополнительно прописывать дефолтное значение для нужных полей: 'default', 'value' => NULL
Так и сделал, теперь при добавлении новой записи всё как задумано, в таблицу пишутся NULL.

Но вот при update всё осталось по-прежнему. Вместо NULL пишутся пустые строки.
Модель, на всякий случай:

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

class RealtyObjects extends \yii\db\ActiveRecord {
    public function rules() {
        return [
.....        
            [['region', 'city', 'destination', .....], 'string', 'max' => 200],
//            [['region', 'city', 'destination', .....], 'trim'],
            [['region', 'city', 'destination', .....], 'default', 'value' => NULL],
        ];
    }
контроллер стандартный

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

    public function actionUpdate($id) {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post())) {
            if ($model->save(false)) { 
                Yii::$app->session->setFlash ('success', 'Объект отредактирован');
            }

            return $this->redirect(['index']);
        }
Подскажите, как можно решить эту проблему?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: В таблицу записываются пустые строки вместо NULL

Сообщение Nex-Otaku »

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

$model->save(false)
Здесь вы указали "false", тем самым отключили валидацию при сохранении. Поэтому ваш валидатор "default" и не отрабатывает.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: В таблицу записываются пустые строки вместо NULL

Сообщение azz »

Nex-Otaku писал(а): 2017.11.16, 17:05

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

$model->save(false)
Здесь вы указали "false", тем самым отключили валидацию при сохранении. Поэтому ваш валидатор "default" и не отрабатывает.
Хм. Логично. Спасибо.

А не появятся ли какие-то нюансы при двойной валидации, если я пишу вот так

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

        if ($model->load(Yii::$app->request->post())) {
            if ($model->validate()) {
                $model->save();
?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: В таблицу записываются пустые строки вместо NULL

Сообщение Nex-Otaku »

Ну если используете только стандартные валидаторы, то не должно быть проблем.
Самому-то можно и такой валидатор сочинить, что будет косячить при двойном прогоне )
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: В таблицу записываются пустые строки вместо NULL

Сообщение caHek2x »

azz писал(а): 2017.11.17, 11:37 А не появятся ли какие-то нюансы при двойной валидации, если я пишу вот так

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

        if ($model->load(Yii::$app->request->post())) {
            if ($model->validate()) {
                $model->save();
?
а зачем так делать ?

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

        if ($model->load(Yii::$app->request->post())) {
            if ($model->save()) {
            
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: В таблицу записываются пустые строки вместо NULL

Сообщение azz »

caHek2x писал(а): 2017.11.17, 12:00
azz писал(а): 2017.11.17, 11:37 А не появятся ли какие-то нюансы при двойной валидации, если я пишу вот так

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

        if ($model->load(Yii::$app->request->post())) {
            if ($model->validate()) {
                $model->save();
?
а зачем так делать ?
у меня загрузка файлов реализована, в том случае если валидация успешна. Файлы загружаются, проверяются, переназываются и только потом, если всё хорошо, добавляется запись в бд.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: В таблицу записываются пустые строки вместо NULL

Сообщение caHek2x »

изначально была проблема как я понял в том что дефол не отрабатывал т.к. не запускалась валидация ...
теперь раз вы сами запускаете валидацию то в save можно false вернуть ... или после загрузки файлов вы тоже хотите отвалидировать что получится ?
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: В таблицу записываются пустые строки вместо NULL

Сообщение azz »

caHek2x писал(а): 2017.11.17, 15:36 изначально была проблема как я понял в том что дефол не отрабатывал т.к. не запускалась валидация ...
всё верно
caHek2x писал(а): 2017.11.17, 15:36 теперь раз вы сами запускаете валидацию то в save можно false вернуть ... или после загрузки файлов вы тоже хотите отвалидировать что получится ?
второй раз валидировать как раз не нужно. Но как я понимаю, что бы автоматом писать в пустые поля дефолтный NULL, нужно либо валидировать повторно (т.е. ->save()), либо если через ->save(false), то вручную присваивать пустым полям NULL?
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: В таблицу записываются пустые строки вместо NULL

Сообщение Auramel »

что за кипиш у вас, ребят, делаете так

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

if ($model->load(Yii::$app->getRequest()->post()) 
    && $model->validate()) {
    $model->save();
}
если нужно какие-то поля вручную вбивать юзаете beforeSave() вместо if ($this->getIsNewRecord()) и в rules у таких полей убираем require, иначе, валидацию не пройдете, а, если заюзаете beforeValidate() оифгеете, когда прикрепите фильтры к GridView
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: В таблицу записываются пустые строки вместо NULL

Сообщение caHek2x »

еще раз ...
у вас вызывается ф-ция $model->validate()
мне ж не показалось ... или это для примера вы написали ?
так вот если вызывается ф-ция validate то зачем вам валидировать еще раз вызывая ->save() без false ??
да я знаю исходники которые лежат у вас в папке vendor могут открыть только избранные )
поэтому расскажу что там написано: save вызывает ф-цию update/insert которые в свою очередь вызывают validate, так вот если вы сами вызываете эту ф-цию то чтоб не повторяться при сохранении можно писать save(false)
Pa3Py6aka
Сообщения: 10
Зарегистрирован: 2016.07.12, 00:58

Re: В таблицу записываются пустые строки вместо NULL

Сообщение Pa3Py6aka »

А зачем вам в базе нужен NULL вместо пустого значения varchar ?
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: В таблицу записываются пустые строки вместо NULL

Сообщение maleks »

azz писал(а): 2017.11.17, 15:55 Но как я понимаю, что бы автоматом писать в пустые поля дефолтный NULL, нужно либо валидировать повторно (т.е. ->save()), либо если через ->save(false), то вручную присваивать пустым полям NULL?
Ничего этого не надо. Все прекрасно валидатор default присваивает NULL и в базу при сохранении он и попадает. Только что у себя проверил. Дебажьте чтобы понять что у вас там не так.
Yii2 universal module sceleton - for basic and advanced templates
Ответить