Yii2-QueryAll有问题

Yii2-QueryAll有问题,yii2,Yii2,我正在使用带有多个where子句的查询生成器。当我使用这个查询时 $query1 = new \yii\db\Query(); $query1->select('*') ->from('assessment_score ca') ->where(['AND','ca.is_status' => 0, 'ca.assessment_type' => 'CONTINUOUS ASSE

我正在使用带有多个where子句的查询生成器。当我使用这个查询时

            $query1 = new \yii\db\Query();
        $query1->select('*')
            ->from('assessment_score ca')
            ->where(['AND','ca.is_status' => 0, 'ca.assessment_type' => 'CONTINUOUS ASSESSMENT', 'ca.ca_type' => 'CONTINUOUS ASSESSMENT'])
            ->andFilterWhere(['ca.state_office_id' => $model->report_state_office_id])
            ->andFilterWhere(['ca.study_centre_id' => $model->report_study_centre_id])
            ->andFilterWhere(['ca.programme_id' => $model->report_programme_id])
            ->andFilterWhere(['ca.department_id' => $model->report_department_id])
            ->andFilterWhere(['ca.academic_level_id' => $model->report_academic_level_id])
            ->andFilterWhere(['ca.academic_year_id' => $model->report_academic_year_id])
            ->andFilterWhere(['ca.academic_semester_id' => $model->report_academic_semester_id])
            ->andFilterWhere(['ca.course_id' => $model->report_course_id]);

        $command=$query1->createCommand();
        $ca_data=$command->queryAll();
我犯了这个错误

然后,当我将代码更改为此时,没有响应:

            $selected_list = $_POST['ca'];

        $query1 = new \yii\db\Query();
        $query1->select('*')
            ->from('assessment_score ca')
            ->where(['ca.is_status' => 0])
            ->andWhere(['ca.assessment_type' => 'CONTINUOUS ASSESSMENT'])
            ->andWhere(['ca.ca_type' => 'CONTINUOUS ASSESSMENT'])
            ->andFilterWhere(['ca.state_office_id' => $model->report_state_office_id])
            ->andFilterWhere(['ca.study_centre_id' => $model->report_study_centre_id])
            ->andFilterWhere(['ca.programme_id' => $model->report_programme_id])
            ->andFilterWhere(['ca.department_id' => $model->report_department_id])
            ->andFilterWhere(['ca.academic_level_id' => $model->report_academic_level_id])
            ->andFilterWhere(['ca.academic_year_id' => $model->report_academic_year_id])
            ->andFilterWhere(['ca.academic_semester_id' => $model->report_academic_semester_id])
            ->andFilterWhere(['ca.course_id' => $model->report_course_id]);

        $command=$query1->createCommand();
        $ca_data=$command->queryAll();

如何适当地重新编写代码以解决多where子句的问题?

基于Yi2运算符格式指南

运算符格式允许您在运算符中指定任意条件 编程方式。它采用以下格式:

[运算符,操作数1,操作数2,…],其中每个操作数都可以是 以字符串格式、哈希格式或运算符格式指定 递归地,而运算符可以是以下之一:

and:应使用and将操作数连接在一起。对于 例如,['和','id=1','id=2']

所以你的情况应该是

->where(['AND', 'ca.is_status = 0',
   "ca.assessment_type = 'CONTINUOUS ASSESSMENT'",
         "ca.ca_type  = 'CONTINUOUS ASSESSMENT'"]) 

您可能需要更改where语句的查询格式,因为您需要将每个条件名称=>值对作为一个单独的数组提供,而不仅仅是名称=>值对,您目前有

->where(['AND', 'ca.is_status' => 0, 'ca.assessment_type' => 'CONTINUOUS ASSESSMENT', 'ca.ca_type' => 'CONTINUOUS ASSESSMENT'])
如果没有为andFilterWhere语句提供其他参数,它将创建如下查询

SELECT * FROM `assessment_score` `ca` 
WHERE (0) 
AND (CONTINUOUS ASSESSMENT) AND (CONTINUOUS ASSESSMENT)
这是不正确的并且抛出了错误,您可以注意到在您的异常图像中,所以将其更改为下面的一个

->where(['AND',
       ['ca.is_status' => 0],
       ['ca.assessment_type' => 'CONTINUOUS ASSESSMENT'],
       ['ca.ca_type' => 'CONTINUOUS ASSESSMENT']
])
这将输出查询,如下所示

SELECT * FROM `assessment_score` `ca` 
WHERE (`ca`.`is_status`=0) 
    AND (`ca`.`assessment_type`='CONTINUOUS ASSESSMENT') 
    AND (`ca`.`ca_type`='CONTINUOUS ASSESSMENT')
您的完整查询应该如下所示

$query1 = new \yii\db\Query();
$query1->select('*')
        ->from('assessment_score ca')
        ->where(['AND',
            ['ca.is_status' => 0],
            ['ca.assessment_type' => 'CONTINUOUS ASSESSMENT'],
            ['ca.ca_type' => 'CONTINUOUS ASSESSMENT']
        ])
        ->andFilterWhere(['ca.state_office_id' => $model->report_state_office_id])
        ->andFilterWhere(['ca.study_centre_id' => $model->report_study_centre_id])
        ->andFilterWhere(['ca.programme_id' => $model->report_programme_id])
        ->andFilterWhere(['ca.department_id' => $model->report_department_id])
        ->andFilterWhere(['ca.academic_level_id' => $model->report_academic_level_id])
        ->andFilterWhere(['ca.academic_year_id' => $model->report_academic_year_id])
        ->andFilterWhere(['ca.academic_semester_id' => $model->report_academic_semester_id])
        ->andFilterWhere(['ca.course_id' => $model->report_course_id]);

$command = $query1->createCommand();
$ca_data = $command->queryAll();
您只需从传递到以下位置的数组中删除和:

若传递关联数组,它将被视为查询中WHERE条件的列值对。如果将和作为第一个元素传递,它将不再是关联数组,查询生成器将忽略键,而仅将值作为完整条件组合

->where([
    'ca.is_status' => 0, 
    'ca.assessment_type' => 'CONTINUOUS ASSESSMENT', 
    'ca.ca_type' => 'CONTINUOUS ASSESSMENT'
])