thinkphp使用Model模型操作数据,在foreach遍历时报错Indirect modification of overloaded element of XXX has no effect

一、报错示例:

1、直接使用Db类操作数据库时不会报错,源代码如下:

        $data = Config::where('ishide',0)->select();
        $new_data= array();
        foreach($data as $k => $d){
            if($d['pid']==0){
                $new_data[] = $d;
                unset($data[$k]);
            }
        }  
        foreach($new_data as $k => $d){ 
            $new_data[$k]['child'] = array();
            foreach($data as $kk => $dd){
                if($d['id'] == $dd['pid']){
                    $new_data[$k]['child'][]=$dd;
                    unset($data[$kk]);
                }
            } 
        }

2、当使用Model操作时,$new_data[$k]['child'][]=$dd; 这行代码会报错,报错信息如下:

        $data = Config::where('ishide',0)->select();
        $new_data= array();
        foreach($data as $k => $d){
            if($d['pid']==0){
                $new_data[] = $d;
                unset($data[$k]);
            }
        }  
        foreach($new_data as $k => $d){ 
            $new_data[$k]['child'] = array();
            foreach($data as $kk => $dd){
                if($d['id'] == $dd['pid']){
                    $new_data[$k]['child'][]=$dd;
                    unset($data[$kk]);
                }
            } 
        }

 二、错误分析:

1、Thinkphp使用Db类操作数据查询时,默认返回的是数据类型是:数组,所以直接使用foreach遍历修改,是没有问题的。

2、当我们使用Model模型类操作数据查询时,返回的数据类型则是:对象,对象是不能进行foreach遍历修改的,所以会报错 “间接修改XXX的重载元素没有效果”

解决方法: 

1、在Model模型类里添加如下代码:

//设置返回数据结果类型
protected $resultSetType = 'collection';

2、在查询出结果后,再使用toArray()方法,把对象转为数组即可,如下:

$data = Config::where('ishide',0)->select()->toArray();

猜你喜欢

转载自blog.csdn.net/qq15577969/article/details/113824450