【问题标题】:yii2 dataprovider with custom query带有自定义查询的 yii2 数据提供程序
【发布时间】:2017-08-07 05:15:29
【问题描述】:

我有以下索引操作代码

$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');

如何在上面的查询中使用组连接和分组? 我已经在控制器的操作中尝试过这个

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

但这会产生以下错误

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

如果我使用 sqldataprovider,那么我不能有过滤选项。

【问题讨论】:

    标签: mysql gridview activerecord yii2 dataprovider


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我已经使用 Sqldataprovider 解决了这个问题。所有数据都完全接受过滤。当我过滤某些东西时,发生错误“SQLSTATE [HY093]:无效的参数号:没有绑定参数”。 “$query->filterWhere(['Like','patient_test.receipt_number', $this->receipt_number]);”中没有参数限制
    • 但是你所有的问题都可以通过运行一个 MySQL 查询来解决。
    • 我已经设置了那些 Set global sqlmode 命令.. 但是按问题分组没有解决
    • 是的...现在一切正常。我只需将 nack sqldataprovider 更改为 activedataprovider 并且查询几乎没有变化。过滤现在也起作用了。谢谢队友
    【解决方案2】:

    我只是改变了这个查询

    $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');
    

    现在一切正常

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 2015-03-24
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多