Yii2 Kartik MultiSelect关联表更新报错:Call to a member function isAttributeRequired() on array
解决编辑Metrics时的"Call to a member function isAttributeRequired() on array"报错
首先咱们得揪出问题的根源:你在编辑场景下传递给视图的$Classificationvsmetric是纯数组格式的查询结果,但$form->field()方法需要的是Yii的ActiveRecord模型实例,普通数组根本没有isAttributeRequired()这个方法,自然会触发报错。
接下来分步骤解决这个问题:
1. 修正控制器中的关联数据查询逻辑
在actionUpdate方法里,你用asArray()->all()把关联数据转成了数组,这是问题的起点。把这行代码改成直接获取ActiveRecord模型集合:
// 原来的错误代码 $releations = $model->getClassificationVsMetrics1()->asArray()->all(); // 修改后的代码 $releations = $model->classificationVsMetrics1; // 直接调用关联属性,获取模型实例集合 // 或者保留手动查询但去掉asArray() // $releations = $model->getClassificationVsMetrics1()->all();
2. 调整视图中Select2的绑定与默认值处理
在_form.php里,不需要绑定到$Classificationvsmetric[0](多选场景下绑定单个模型完全不合理),我们直接处理多选的默认值即可:
$classificationIndustry = ArrayHelper::map(\common\models\Classifications::find()->all(),'id',function($model,$default){ return $model["industry"]." - ".$model["sector"] ." - ".$model['sub_sector']; }); // 提取编辑场景下已选中的classification_id数组 $selectedClassifications = []; if (!$model->isNewRecord) { foreach ($Classificationvsmetric as $relation) { $selectedClassifications[] = $relation->classification_id; } } // 用临时字段绑定Select2,避免关联模型的冲突 echo $form->field($model, 'temp_class_ids')->widget(Select2::classname(), [ 'data' => $classificationIndustry, 'value' => $selectedClassifications, // 编辑时的默认选中值 'language' => 'en', 'options' => ['placeholder' => 'Select classification(s)','multiple' => true], 'pluginOptions' => [ 'allowClear' => true, ], ])->label('Classifications');
3. 修正控制器接收提交数据的代码
因为我们把表单字段改成了temp_class_ids,所以要调整actionUpdate里的接收逻辑:
// 原来的代码 $classifications = Yii::$app->request->post()["Classificationvsmetric"]['classification_id']; // 修改后的代码 $classifications = Yii::$app->request->post($model->formName(), [])['temp_class_ids'] ?? [];
另外给你加个小优化:在循环保存关联数据时,加上错误处理避免静默失败:
foreach ($classifications as $value) { $Classificationvsmetric = new Classificationvsmetric(); $Classificationvsmetric->classification_id = (int)$value; $Classificationvsmetric->metric_id = $model->id; if (!$Classificationvsmetric->save()) { // 可以记录错误日志,方便排查问题 Yii::error('保存关联关系失败: ' . print_r($Classificationvsmetric->errors, true)); } }
这样修改后,编辑场景下的报错就会消失,多选值的加载和保存逻辑也会更稳定。
内容的提问来源于stack exchange,提问作者Praveen Kumar
相关产品推荐
相关产品推荐

