yii2向数据库插入同名的输入?

时间:2016-07-29 17:09:03

标签: php mysql yii2

我正在尝试在yii2中的数据库中插入数据,但我喜欢3个具有相同名称的输入。 当我尝试插入数据库时​​,它只插入最后一个输入的值。

这是我的控制器

public function actionCompose_vote()
{
    $topic= new Topic(); 
    if ($topic->load(Yii::$app->request->post())) {
        $topic->load($_POST);
        $topic->save();
        return $this->refresh();
    }
    return $this->render('compose_vote');
}

这是观点     

use yii\widgets\ListView;
use yii\data\ArrayDataProvider;
use app\models\MyProfile;
use app\models\LikeDiscussion;
use yii\widgets\ActiveForm;
use common\models\Topic;
use common\models\Comment;
use common\models\Users;
use common\models\Candidate;
use yii\widgets\Pjax;
use yii\helpers\Html;
use frontend\assets\AppAsset;

$this->title = 'My Yii Application';
?>
<?php $form = ActiveForm::begin(); ?>
    <input type="name"  class="form-control"  required="true" name="Topic[topic]" id="topic" placeholder="topic">
    <input type="name"  class="form-control"  required="true" name="Topic[topic]" id="topic" placeholder="topic">
    <input type="name"  class="form-control"  required="true" name="Topic[topic]" id="topic" placeholder="topic"> 
<?php ActiveForm::end(); ?>  

我还尝试将值放在foreach循环中

foreach ($_POST['Topic[topic]'] as $top) {
    $top => $topic;
}

但是它给出了变量“Topic [topic]”不存在的错误。

还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

请阅读docs。当我们可以使用ActiveForm时,用纯HTML添加输入有什么意义呢?另外,您缺少以这种方式进行的所有验证。

如果您有一个可以同时保存多个值的表单,我强烈建议您为此表单创建另一个模型。像这样:

class ModelForm extends \yii\base\Model
{
    public $attribute;

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['attribute'], 'safe'],
        ];
    }

    /**
     * @return array customized attribute labels
     */
    public function attributeLabels()
    {
        return [
            'attribute' => 'Friendly Name',
        ];
    }
}

现在您可以在视图中使用它了:

<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($modelForm, 'attribute[]') ?>
    <?= $form->field($modelForm, 'attribute[]') ?>
    <?= $form->field($modelForm, 'attribute[]') ?>
    <?= $form->field($modelForm, 'attribute[]') ?>

<?php $form = ActiveForm::end(); ?>

添加[]将确保$_POST值为数组。然后,您可以获取此数组并在控制器中创建一个循环,以尝试保存模型的新实例:

$modelForm = new ModelForm();

if ($modelForm->load(Yii::$app->request->post())) {
    foreach ($modelForm->attribute as $attribute) {
        $model = new Model(['attribute' => $attribute]); // load each information in your desired model->attribute

        if (!$model->save()) {
            var_dump($model->getErrors()); // verify each Model could be saved and, if not, handle the error.
            return;
        }
    }

    return $this->refresh();
}

return $this->render('compose_vote', ['modelForm' => $modelForm]);