- ActiveForm表单提交后,通过网页中Network可知表单数据已经向控制器提交。但是,控制器中却接受不到数据。
我遇到这个问题的原因是:在表单模型的类文件中没有给表单的属性设置规则,就是没有使用rules()方法对属性设置规则。以我遇到的问题为例:
public function rules()
{
return [
[['id', 'name', 'code', 'type'], 'required'],
]
}
只需要简单的这样写就可以在控制器中获取到表单数据了。经过测试,在该方法中注释掉的属性都无法穿到控制器中。
2.在ActiveForm表单中使用dropDownList,比如下面的代码:
类型:<?php echo $form->field($model, 'type')->dropDownList($class::$type,['prompt'=>'请选择', 'style' => 'with:120px', 'class' => 'form-control']) ?>
在页面中显示几条带选的选项,如果选择 '请选择' 这个选项,后项后台传入:
'' //空,并不是null
如果选择其他的选项,这传入的是每个选项对应的key,并使选项本身的value,这里是:
0 //第一个选项
1 //第二个选项
//...
- 数据库在 连表查询 的时候,报如下错误:
Exception (Integrite constraint violation) 'yii\db\IntegrityException' with
message 'SQLSTATE[23000]: Integrity constraint violation: 1052 Column
'question_id' in where clause is ambiguous.
The SQL being executed was: SELECT COUNT(*) FROM `answer` LEFT JOIN `question` `q` ON `answer`.question_id = q.question WHERE `question_id` = '10''
这句话的主要意思是说,在 WHERE 子句中的 'question_id' 是模棱两可的。
为什么会产生这样的报错信息呢?因为在这两张表中均有 'question_id'字段,产生这样的错误是因为传给 SQL 语句的中,即 WHERE 子句中的 'question_id' 没有指明是哪个表中的,从而导致不知道去哪一张表中查询。
解决思路:给传入的字段 'question_id' 加上标识,区分是哪个表中的。
解决办法: 其实在Yii中已经封装了解决的办法。在 AnswerSearch.php 和 QuestionSearch.php 两个搜索模型的查询语句中加入
$query->andFilterWhere([
Answer::tableName(). '.question_id' => $this->question_id
]);
$query->andFilterWhere([
Question::tableName(). '.question_id' => $this->question_id
]);
即可区分两个表(模型)中的字段。