Yii2-QueryAll出现问题

时间:2018-08-24 14:35:39

标签: yii2

我正在使用带有多个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();

我收到此错误

Query Error

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

            $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子句的问题?

3 个答案:

答案 0 :(得分:1)

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

->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)

这是不正确的并引发错误,您可以在Exception图像中注意到,因此将其更改为下面的一个

->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();

答案 1 :(得分:0)

基于yii2运算符格式指南

  

运算符格式允许您在   编程方式。它采用以下格式:

     

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

     

and:操作数应使用AND串联在一起。对于   例如['and','id = 1','id = 2']

因此您的情况应该是

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

https://www.yiiframework.com/doc/guide/2.0/en/db-query-builder#operator-format

答案 2 :(得分:0)

您需要做的就是从传递给AND的数组中删除where()

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

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