当 Gridview Filter Returns 只有一行时 Yii2 错误异常
Yii2 Error Exception When Gridview Filter Returns Only ONE Row
我有这样的 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 中 运行 它给出了一行。
当过滤器的结果 returns 超过一行时(我在 PhpMyAdmin 中也 运行 它,以防万一,它给出了超过一行),它工作得很好。
我在这里错过了什么?
解决方案
我不知道为什么,但是当我删除连接 regencyrel
这是一个通过另一个连接的连接时,它会产生奇迹。
$query->joinWith(['commodity', 'unit']);
我有这样的 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 中 运行 它给出了一行。
当过滤器的结果 returns 超过一行时(我在 PhpMyAdmin 中也 运行 它,以防万一,它给出了超过一行),它工作得很好。
我在这里错过了什么?
解决方案
我不知道为什么,但是当我删除连接 regencyrel
这是一个通过另一个连接的连接时,它会产生奇迹。
$query->joinWith(['commodity', 'unit']);