Yii2 dropDownList - 无法更新多个字段
Yii2 dropDownList - Trouble updating multiple fields
您好,我正在 Yii2 中创建下拉列表,但在更新多个字段时遇到问题。我是新手,一直在寻找 2 天,试图找到一个没有运气的答案。
我有两个数据库和 3 个表。
db1.area(包含分支的id和名称)
db2.majorregion(主要地区的id和名称)
db2.majorregionbranch (id, branchid[area.id], branchname[area.name], majorregionid)
我可以毫无问题地将数据拉入并显示到下拉列表中。
这是我卡住的地方。
我正在从 Area 模型中提取 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>
EDIT/Update:添加 Table 详细信息。
区域 ID 和名称将作为 branch_id 和 branch_name 插入 MajorRegionBranch,MajorRegion 的 ID 将作为 major_region_id.
插入 MajorRegionBranch
区域 ID(branch_id) 和 major_region_id 都可以,插入区域名称(branch_name)
不起作用
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 | |
+------------------------------+------------+------+-----+---------+-------+
----更多更新----
这是我的控制器中创建方法的片段
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,
]);
}
}
原因是您的表单只考虑了 MajorRegionBranch 的两个属性:两个 id 属性。该表单不包含分支名称的输入。当然,你不希望这样,两个下拉菜单就足够了。
但是,当表单在创建或更新时提交时,模型对象将被加载并且只接收这两个 id 值。所以模型中的 'name' 没有得到新的值。模型不知道名称应该对应于 id。没有这种魔法。
你有不同的方法来解决这个问题。你可以:
- 修改操作,以便设置名称 'manually'(可能在
load()
之后但在 save()
/validate()
之前
- 在模型中覆盖
beforeSave()
或save()
设置名称'manually'
- 在模型中覆盖
load()
设置名称'manually'
- 在您的模型中实施 setBranchId($value) 以在此时及时设置名称 'manually'
- 在表单中为名称 (
$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,
]);
}
}
您好,我正在 Yii2 中创建下拉列表,但在更新多个字段时遇到问题。我是新手,一直在寻找 2 天,试图找到一个没有运气的答案。
我有两个数据库和 3 个表。
db1.area(包含分支的id和名称)
db2.majorregion(主要地区的id和名称)
db2.majorregionbranch (id, branchid[area.id], branchname[area.name], majorregionid)
我可以毫无问题地将数据拉入并显示到下拉列表中。
这是我卡住的地方。
我正在从 Area 模型中提取 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>
EDIT/Update:添加 Table 详细信息。
区域 ID 和名称将作为 branch_id 和 branch_name 插入 MajorRegionBranch,MajorRegion 的 ID 将作为 major_region_id.
插入 MajorRegionBranch区域 ID(branch_id) 和 major_region_id 都可以,插入区域名称(branch_name)
不起作用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 | |
+------------------------------+------------+------+-----+---------+-------+
----更多更新---- 这是我的控制器中创建方法的片段
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,
]);
}
}
原因是您的表单只考虑了 MajorRegionBranch 的两个属性:两个 id 属性。该表单不包含分支名称的输入。当然,你不希望这样,两个下拉菜单就足够了。
但是,当表单在创建或更新时提交时,模型对象将被加载并且只接收这两个 id 值。所以模型中的 'name' 没有得到新的值。模型不知道名称应该对应于 id。没有这种魔法。
你有不同的方法来解决这个问题。你可以:
- 修改操作,以便设置名称 'manually'(可能在
load()
之后但在save()
/validate()
之前
- 在模型中覆盖
beforeSave()
或save()
设置名称'manually' - 在模型中覆盖
load()
设置名称'manually' - 在您的模型中实施 setBranchId($value) 以在此时及时设置名称 'manually'
- 在表单中为名称 (
$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,
]);
}
}