Laravel查询ClickHouse报错:无法读取数组上的id_tahun属性
错误原因
使用Laravel的DB门面连接Clickhouse执行select()查询时,所用的Clickhouse驱动默认将查询结果以关联数组的格式返回,而非其他数据库驱动默认返回的stdClass对象。此时遍历结果集时用对象操作符->读取数组类型的元素字段,就会触发「Attempt to read property "id_tahun" on array」报错。
修复方法
你可以任选以下一种方案调整代码:
- 方案1:改用数组下标方式访问字段值,无需额外转换结果格式,修改后代码如下:
$factpelanggan = DB::connection('clickhouse') ->select('SELECT id_tahun, t.tahun, l.id_lokasi from dim_tahun t, dim_lokasi l'); foreach ($factpelanggan as $value) { $id_tahun[] = $value['id_tahun']; $id_lokasi[] = $value['id_lokasi']; $tahun[] = $value['tahun']; }
- 方案2:如果习惯用对象属性的写法,遍历前先将所有数组结果转换为stdClass对象,修改后代码如下:
$factpelanggan = DB::connection('clickhouse') ->select('SELECT id_tahun, t.tahun, l.id_lokasi from dim_tahun t, dim_lokasi l'); // 批量将关联数组转为对象 $factpelanggan = array_map(fn($row) => (object)$row, $factpelanggan); foreach ($factpelanggan as $value) { $id_tahun[] = $value->id_tahun; $id_lokasi[] = $value->id_lokasi; $tahun[] = $value->tahun; }
- 方案3:查看你当前使用的Clickhouse Laravel扩展文档,部分扩展支持修改配置项,可直接设置查询结果默认返回对象格式,无需每次手动转换。
内容的提问来源于stack exchange,提问作者Ronaldo Firmansyah
相关产品推荐
相关产品推荐

