1.エラーレポートの例:
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.モデル操作を使用する場合、$ 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]);
}
}
}
2.エラー分析:
1. ThinkphpがDbクラスを使用してデータクエリを操作する場合、返されるデフォルトのデータ型はarrayであるため、foreachを使用して直接トラバースおよび変更することは問題ありません。
2. Modelモデルクラスを使用してデータクエリを操作すると、返されるデータ型は次のようになります。object、オブジェクトはforeachトラバーサルでは変更できないため、「XXXのオーバーロードされた要素の間接的な変更は効果がありません」というエラーが発生します。報告されました。
解決:
1.次のコードをModelクラスに追加します。
//设置返回数据结果类型
protected $resultSetType = 'collection';
2.結果をクエリした後、次のようにtoArray()メソッドを使用してオブジェクトを配列に変換します。
$data = Config::where('ishide',0)->select()->toArray();