Yii2.0踩坑记(持续更新)

字数 450阅读 75
  1. 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 //第二个选项
  //...

  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.phpQuestionSearch.php 两个搜索模型的查询语句中加入

$query->andFilterWhere([
Answer::tableName(). '.question_id'  => $this->question_id
]);
$query->andFilterWhere([
Question::tableName(). '.question_id'  => $this->question_id
]);

即可区分两个表(模型)中的字段。

推荐阅读更多精彩内容