yii2 dataprovider自定义查询

时间:2017-08-07 05:15:29

标签: mysql gridview activerecord yii2 dataprovider

我有以下的索引操作代码

$searchModel = new PatientTestSearch();
 $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

   return $this->render('index', [
            'dataProvider' => $dataProvider,
            'searchModel' => $searchModel,
           ]);

PatientTestSearch中的搜索功能

    $query = PatientTest::find();

    $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => ['pageSize' => $pagination],
            'sort' => ['defaultOrder' => ['created_at' => SORT_DESC]]
        ]);
    $query->joinWith('patient');
    $query->joinWith('testGroup');

如何在上面的查询中使用group concate和group? 我在控制器的行动中试过这个

$dataProvider->query->groupBy(['patient_id']);

但这会产生以下错误

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列' wizlaboratory.patient_test.patient_id'它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by

不兼容

如果我使用sqldataprovider,那么我就无法使用过滤选项。

2 个答案:

答案 0 :(得分:2)

ONLY_FULL_GROUP_BY模式拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖于(由GROUP BY列唯一确定)的非聚合列

  • 要在数据库级别解决此问题,您可以关闭 通过在mysql中运行此查询来ONLY_FULL_GROUP_BY模式:

    SET GLOBAL sql_mode =(SELECT REPLACE(@@ sql_mode,'ONLY_FULL_GROUP_BY',''));

  • 要在$query中解决此问题,请将所有必填字段添加到groupBy()方法。 ($query->groupBy(['attr1', 'attr2'])

答案 1 :(得分:1)

我只是更改此查询

$query = PatientTest::find();

到这个

$query = new Query();
        $query->select('patient.id as id,patient_test.receipt_number,patient.name as patient_id, GROUP_CONCAT(test_group.name) as test_group_id,
                       patient.age as patient_test_age,patient.gender as patient_test_gender,patient.mobile_no as patient_test_mobile,patient_test.test_date,patient_test.is_sample_received,
                       patient_test.datetime')
            ->from('patient_test');

        $query->join = [
            ['LEFT JOIN', 'patient', 'patient_test.patient_id = patient.id'],
            ['LEFT JOIN', 'test_group', 'patient_test.test_group_id = test_group.id']];
        if ($pid != null && $pid != '') {
            $query->where('patient_test.patient_id = ' . $pid);
        }
        $query->groupBy(['patient_test.patient_id', 'patient_test.receipt_number', 'patient_test.test_date', 'patient_test.datetime', 'patient_test.is_sample_received']);
        $query->orderBy('patient.id DESC');

并在下方评论加入查询

//$query->joinWith('patient');
//$query->joinWith('testGroup');

现在一切正常