thinkphpは、モデルモデルを使用してデータを操作し、エラーを報告します。XXXのオーバーロードされた要素を間接的に変更しても、foreachトラバーサル中には効果がありません。

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();

 

 

おすすめ

転載: blog.csdn.net/qq15577969/article/details/113824450