Yii2表单模型在DB中保存NULL

时间:2018-06-15 10:57:18

标签: yii2

所以构建一个简单的表单,但是当我尝试保存表单时,它不保存值但只保存NULL(当我将NULL更改为NOT NULL时会出错)。

每次我保存它都会添加一个新行,但我只需要1行即可将值保存在1行中。

db table

`id` int(11) NOT NULL,
`modalactive` tinyint(4) DEFAULT NULL,
`modaltimeout` bigint(20) DEFAULT NULL,
`activeon` longtext DEFAULT NULL

控制器

public function actionIndex()
{

    $model = new CmsSettings();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {

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

    }else{

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

    }

}

模型

class CmsSettings extends ActiveRecord
{
   public $id;
   public $modalactive;
   public $modaltimeout;
   public $activeon;

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

   public function rules(){
     return [
        [['modelactive'], 'required'],
        [['modalactive', 'modaltimeout'], 'integer']
     ];
   }
}

查看

$form = ActiveForm::begin([
    'action'  => yii\helpers\Url::to(['cms-settings/index']),      
]);


echo $form->field($model, 'modalactive');
echo $form->field($model, 'modaltimeout');
echo $form->field($model, 'activeon');

echo Html::submitButton(Yii::t('cms', 'save'));

ActiveForm::end();

3 个答案:

答案 0 :(得分:1)

删除它:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 'android-P'
    defaultConfig {
        applicationId "ru.scapegoats.myapplication"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'
    implementation 'com.google.android.material:material:1.0.0-alpha3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'
}

来自你的模特。

之后,将字段 public $id = 1; public $modalactive = 1; public $modaltimeout = 20000; public $activeon; 添加到您的activeon方法中。 rules()方法中不存在的字段不安全,并且不会被处理。添加rules()用于测试目的,如果可行的话 - 将其更改为正确的验证。

这就是全部。 ActiveRecord会自动映射表中的列。如果你覆盖它 - 它将无法得到妥善处理。要设置默认值,您应使用['activeon', 'save']验证程序 - Yii2 - Core Default Validator

关于多次保存 - 您必须在使用default之前加载模型。现在,您每次保存时都会创建新模型

答案 1 :(得分:0)

您需要删除这些属性:

$model->load()

这些将从数据库结构中获取,并通过public $id = 1; public $modalactive = 1; public $modaltimeout = 20000; public $activeon; __get()魔术方法作为虚拟属性提供。

答案 2 :(得分:0)

规则中使用的属性名称错误。

请在modelactive模型中的modalactive方法中将属性rules更改为CmsSettings,并删除顶部模型中定义的属性。