Yii2 将表单字段数组保存到单个数据库字段

2022-01-07 00:00:00 arrays php yii2

如何在 Yii2 中保存字段数组当前/默认设置仅适用于非数组字段.

以下是我需要保存到单个字段中的表单字段:

<table class="wrapper" width="100%"><头><tr><td width="10%" colspan="4"><span class="add">添加</span></td></tr></thead><tbody class="容器"><tr class="模板行"><td width="10%"><span class="move">Move</span></td><td width="10%">一个输入字段</td><td width="70%"><?= $form->field($model, 'field1ofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('字段标签') ?><?= $form->field($model, 'fieldofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Som 字段') ?><?= $form->field($model, 'field3ofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('字段标签') ?><?= $form->field($model, 'field4ofarray[{{row-count-placeholder}}]')->dropDownList(['instock' => 'Instock', 'soldout' =>; '售罄', '预定' => '预定']);?></td><td width="10%"><span class="remove">Remove</span></td></tr></tbody>

当前控制器(我需要知道如何遍历数组并保存以及在表单中保存其他普通字段):

公共函数actionCreate(){$model = new GrailWall();if ($model->load(Yii::$app->request->post()) && $model->save()) {返回 $this->redirect(['view', 'id' => $model->id]);} 别的 {返回 $this->render('create', ['模型' =>$模型,]);}}

解决方案

就我而言,我根本不需要对控制器进行任何更改.

您可以在数据库记录中创建一个字段,例如config_json",然后在模型中使用 getter 和 setter 定义一个虚拟属性.

公共函数getConfig(){返回 json_decode($this->config_json);}公共函数 setConfig($value){$this->config_json = json_encode($value);}

还要在规则中将您的虚拟财产设置为安全,以便大规模分配工作.

公共函数规则(){返回 [[['company_id', 'created_at', 'updated_at'], 'integer'],[['类'],'必需'],[['config_json'], 'string'],[['class'], 'string', 'max' =>255],[['配置'],'安全']];}

现在您可以在视图中设置这样的输入

field($model, 'config[ga_id]', ['labelOptions' => ['label' => 'Google Analytics Tracking ID']])->textInput(['maxlength' => true]) ?>

How can I save an array of fields in Yii2 the current/default setup only works for field which aren't array.

Below are the form fields I need to save into the single field:

<div class="repeat">
<table class="wrapper" width="100%">
    <thead>
        <tr>
            <td width="10%" colspan="4"><span class="add">Add</span></td>
        </tr>
    </thead>
    <tbody class="container">
    <tr class="template row">
        <td width="10%"><span class="move">Move</span></td>

        <td width="10%">An Input Field</td>

        <td width="70%">
            <?= $form->field($model, 'field1ofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Field Label') ?>
            <?= $form->field($model, 'fieldofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Som field') ?>
            <?= $form->field($model, 'field3ofarray[{{row-count-placeholder}}]')->textInput(['maxlength' => 255])->label('Field Label') ?>
            <?= $form->field($model, 'field4ofarray[{{row-count-placeholder}}]')->dropDownList(['instock' => 'Instock', 'soldout' => 'Sold Out', 'scheduled' => 'Scheduled']); ?>
        </td>

        <td width="10%"><span class="remove">Remove</span></td>
    </tr>
    </tbody>
</table>

Current Controller (I need to know how I can loop through array and save as well as saving other normal fields in my form):

public function actionCreate()
{
    $model = new GrailWall();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

解决方案

In my case I didn't need to make any changes to the controller at all.

You can just make a field in your db record, something like 'config_json` and then define a virtual property with getter and setter in your model.

public function getConfig()
{
    return json_decode($this->config_json);
}

public function setConfig($value)
{
    $this->config_json = json_encode($value);
}

Also set your virtual property to be safe in the rules so Massive Assignment works.

public function rules()
{
    return [
        [['company_id', 'created_at', 'updated_at'], 'integer'],
        [['class'], 'required'],
        [['config_json'], 'string'],
        [['class'], 'string', 'max' => 255],
        [['config'], 'safe']
    ];
}

Now you can set inputs like this in your view

<?= $form->field($model, 'config[ga_id]', ['labelOptions' => ['label' => 'Google Analytics Tracking ID']])->textInput(['maxlength' => true]) ?>

相关文章