Yii2 dropDownList - 无法更新多个字段

时间:2015-03-25 13:39:19

标签: php drop-down-menu yii2

您好我在Yii2中创建了一个下拉列表,但我无法更新多个字段。我是新手,并且一直在寻找2天试图找到一个没有运气的答案。

我有两个数据库和3个表。

db1.area(包含分支的ID和名称)

db2.majorregion(主要区域的ID和名称)

db2.majorregionbranch(id,branchid [area.id],branchname [area.name],majorregionid)

我可以毫无问题地将数据拉入并显示在下拉列表中。

这是我被卡住的地方。

我从区域模型中提取id和名称,然后选择该名称,然后更新主要区域分配。

我的麻烦是将area.id和area.name更新为branchid,将branchname更新为db2.majorregionbranch。 它似乎只会更新branchid,而不是更新branchname。

majoregionid工作的第二次下拉没问题。

任何人都可以指出我正确的方向,因为我似乎在没有运气的情况下走了一圈。

如果您需要我的更多信息,请与我们联系。

这是我的_form.php(使用gii crud和修改后的下拉列表生成)

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use app\models\MajorRegion;
use app\models\Area;

/* @var $this yii\web\View */
/* @var $model app\models\MajorRegionBranch */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="major-region-branch-form">

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

    <?= $form->field($model, 'BranchID')->dropDownList(
        ArrayHelper::map(Area::find()->all(),
                         'id', 
                         'name'),
       ['prompt'=>'Select Branch']
    ) ?>

    <?= $form->field($model, 'MajorRegionID')->dropDownList(
        ArrayHelper::map(MajorRegion::find()->all(),
                        'ID', 
                        'MajorRegionName'), 
        ['prompt'=>'Select Major Region']
    ) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 
            'Create' : 
            'Update', 
           ['class' => $model->isNewRecord ? 
                       'btn btn-success' :
                       'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>
</div>

编辑/更新:添加表格详细信息。

区域ID和名称将作为branch_id和branch_name插入MajorRegionBranch,MajorRegion中的id将作为major_region_id插入MajorRegionBranch。

区域id(branch_id)和major_region_id都工作正常,不起作用的是插入区域名称(branch_name)

&#13;
&#13;
mysql> describe MajorRegionBranch;
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| ID              | int(32)     | NO   | PRI | NULL    |       | 
| branch_id       | int(32)     | YES  | MUL | 0       |       | 
| branch_name     | varchar(32) | YES  |     | NULL    |       | 
| major_region_id | int(32)     | YES  |     | 0       |       | 
+-----------------+-------------+------+-----+---------+-------+

mysql> describe MajorRegion;      
+-------------------+-------------+------+-----+---------+----------------+
| Field             | Type        | Null | Key | Default | Extra          |
+-------------------+-------------+------+-----+---------+----------------+
| ID                | int(32)     | NO   | PRI | NULL    | auto_increment | 
| major_region_name | varchar(32) | YES  |     | NULL    |                | 
+-------------------+-------------+------+-----+---------+----------------+

mysql> describe area;
+------------------------------+------------+------+-----+---------+-------+
| Field                        | Type       | Null | Key | Default | Extra |
+------------------------------+------------+------+-----+---------+-------+
| id                           | int(11)    | NO   | PRI | NULL    |       | 
| name                         | text       | NO   |     | NULL    |       | 
+------------------------------+------------+------+-----+---------+-------+
&#13;
&#13;
&#13;

----更多更新---- 以下是我的控制器中用于创建方法的片段

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

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

1 个答案:

答案 0 :(得分:1)

原因是您的表单只考虑了MajorRegionBranch的两个属性:两个id属性。表单不包含分支名称的输入。当然,你不希望这样,两次下拉就足够了。

但是,在创建或更新时提交表单时,将加载模型对象并仅接收这两个id值。因此,模型中的“名称”不会获得新值。模型不知道名称应该与id对应。没有这种魔力。

你有不同的方法来解决这个问题。你可以:

  • 修改操作,以便您将名称设置为“手动”(可能在load()之后但在save() / validate()之前
  • 覆盖模型中的beforeSave()save(),将名称设置为“手动”
  • 覆盖模型中的load()以设置名称“手动”
  • 在模型中实现setBranchId($ value),以便在此时“手动”设置名称
  • 将隐藏字段放入名称($form->field($model, 'BranchName')->hidden())的表单中,并在dropDown更改时或表单提交之前通过JavaScript设置值(这是一个不太强大的解决方案,用户可以操作名称)
  • 使用AttributeBehavior作为分支名称属性自动分配值
  • ...

我更喜欢第一种方法,因为我不喜欢活动记录模型对象本身启动查询来获取名称。它可能看起来像这样(未经测试):

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

    $model->load(Yii::$app->request->post());

    //Next 3 lines will fetch the correct name for the branch name attribute
    $postedFormData = Yii::$app->request->post(MajorRegionBranch::formName());
    $area = Area::find()->where(['id' => $postedFormData['BranchID']])->one();
    $model->BranchName = $area->name;

    if ($model->save()){
        return $this->redirect(['view', 'id' => $model->ID]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}