【问题标题】:Yii2 Error Exception When Gridview Filter Returns Only ONE RowYii2 Gridview 过滤器仅返回一行时出现错误异常
【发布时间】:2020-06-26 04:17:12
【问题描述】:

我有这样的 Gridview:

但是每当我使用过滤器并且预期的结果是只有一行时,它就会向我显示这个错误:

试图访问 null 类型值的数组偏移量

这是搜索模型中的代码:

public function searchproduksi($params) {
    $query = Entrisampelbulanantanpaduplicateplusperusahaan::find()
            ->where('statusnya <> 0')
            ->select(['entrisampelbulanantanpaduplicateplusperusahaan.kode_satuan',
                'entrisampelbulanantanpaduplicateplusperusahaan.tahun',
                'entrisampelbulanantanpaduplicateplusperusahaan.triwulan',
                'entrisampelbulanantanpaduplicateplusperusahaan.kodebulan',
                'entrisampelbulanantanpaduplicateplusperusahaan.kode_kabupaten',
                'entrisampelbulanantanpaduplicateplusperusahaan.kode_komoditas',
                'entrisampelbulanantanpaduplicateplusperusahaan.statusnya',
                'kabupaten.nama_kabupaten as wilayah',
                //'entrisampelbulanantanpaduplicateplusperusahaan.banyak_satuan',
                'sum(banyak_satuan) AS banyak_satuan'
            ])
            ->groupBy(['tahun', 
                'triwulan',
                'kodebulan',
                'entrisampelbulanantanpaduplicateplusperusahaan.kode_komoditas', 
                'entrisampelbulanantanpaduplicateplusperusahaan.kode_satuan'])
    ;

    // add conditions that should always apply here

    $query->joinWith(['regencyrel', 'district', 'commodity', 'unit']);

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'defaultOrder' => ['tahun' => SORT_ASC, 'triwulan' => SORT_ASC, 'kodebulan' => SORT_ASC, 'kode_komoditas' => SORT_ASC,]]
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }

    // grid filtering conditions
    $query->andFilterWhere([
        'id_sampel' => $this->id_sampel,
        'entrisampelbulanantanpaduplicateplusperusahaan.triwulan' => $this->triwulan,
        'banyak_satuan' => $this->banyak_satuan,
        ...
        'entrisampelbulanantanpaduplicateplusperusahaan.kodebulan' => $this->kodebulan,
        'target' => $this->target,
    ]);

    $query->andFilterWhere(['like', 'kode_perusahaan', $this->kode_perusahaan])
            ->andFilterWhere(['like', 'tahun', $this->tahun])
            ...
            ->andFilterWhere(['like', 'accessToken', $this->accessToken]);

    return $dataProvider;
}

过滤器使用属性 tahun、triwulan、 和 _kodebulan_。

上面代码中预期的 SQL 语法是:

SELECT `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_satuan`, `entrisampelbulanantanpaduplicateplusperusahaan`.`tahun`, `entrisampelbulanantanpaduplicateplusperusahaan`.`triwulan`, `entrisampelbulanantanpaduplicateplusperusahaan`.`kodebulan`, `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_kabupaten`, `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_komoditas`, `entrisampelbulanantanpaduplicateplusperusahaan`.`statusnya`, `kabupaten`.`nama_kabupaten` AS `wilayah`, sum(banyak_satuan) AS `banyak_satuan` FROM `entrisampelbulanantanpaduplicateplusperusahaan` LEFT JOIN `perusahaan` ON `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_perusahaan` = `perusahaan`.`username` LEFT JOIN `kabupaten` ON `perusahaan`.`kode_kabupaten` = `kabupaten`.`kode_kabupaten` LEFT JOIN `kecamatan` ON `entrisampelbulanantanpaduplicateplusperusahaan`.`id_kecamatan` = `kecamatan`.`id_kecamatan` LEFT JOIN `komoditas` ON `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_komoditas` = `komoditas`.`kode_komoditas` LEFT JOIN `satuan` ON `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_satuan` = `satuan`.`kode_satuan` WHERE (statusnya <> 0) AND ((`entrisampelbulanantanpaduplicateplusperusahaan`.`triwulan`='2') AND (`entrisampelbulanantanpaduplicateplusperusahaan`.`kodebulan`='5')) AND (`tahun` LIKE '%2020%') GROUP BY `tahun`, `triwulan`, `kodebulan`, `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_komoditas`, `entrisampelbulanantanpaduplicateplusperusahaan`.`kode_satuan` ORDER BY `tahun`, `triwulan`, `kodebulan`, `kode_komoditas` LIMIT 20

我在 PhpMyAdmin 中运行它,它给出了一行。

当过滤器的结果返回多行时(我也在 PhpMyAdmin 中运行它,以防万一,它提供多行),它工作得很好。

我在这里错过了什么?

【问题讨论】:

  • 尝试在调试面板中查找生成的SQL,看看是否与您期望的不同。

标签: sql filter yii2


【解决方案1】:

解决方案

我不知道为什么,但是当我删除连接 regencyrel 时,它是通过另一个连接连接的,它会产生奇迹。

$query->joinWith(['commodity', 'unit']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多