首页 > 编程语言> > thinkphp使用Model模型操作数据,在foreach遍历时报错Indirect modification of overloaded element of XXX has no effect
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();
标签:XXX,no,dd,overloaded,报错,foreach,child,new,data 来源: https://blog.csdn.net/qq15577969/article/details/113824450