実現したいこと
Controller内で、
渡されたidに紐づくデータがあればSELECT文を実行したデータをbladeに渡し、
なければINSERT文を実行後、INSERTしたデータに基づいてSELECT文を実行しそのデータをbladeに渡そうとしています。
発生している問題・分からないこと
トランザクションを作成し、INSERT、SELECT実行後にCOMMITしており、取得したいデータをSELECT文で取得できていることはログに出力して確認していますが、
bladeに引き渡す際にnullとなっているのか「Attempt to read property "id" on null」エラーになります。
※blade内でfor文を作成し、その中で「$datas->id」を使用している箇所でエラーになっています。
ログを見る限りデータは取得できているので、bladeに引き渡す際に問題があるのか、処理の順番の問題なのか、と考えましたが解決できておりません。
また、INSERTも成功してCOMMITされた状態になっているので、再度同じbladeのページを開く際はエラーなく取得したデータでページを作成できております。
エラーメッセージ
error
1[previous exception] [object] (ErrorException(code: 0): Attempt to read property \"id\" on null at /var/www/html/storage/framework/views/f02f8c7a9af0c38077d062ddcd8d8a0d.php:194) 2[stacktrace]
該当のソースコード
$data_1 = DB::table('table_2') ->select('id', //省略) //省略 ->where('id',$id) ->get(); try{ if(count($data_1)==0){ DB::beginTransaction(); $datasx = DB::table('table_1') ->where("id",$id) ->get(); foreach ($datasx as $key => $data){ $datainsert[] = [ 'data_a' => $data->a, 'data_id' => $data->id, 'created_at' => now(), 'updated_at' => now(), ]; } if(count($datainsert)>0){ DB::table('table_2')->insert($datainsert); $datas = DB::table('table_2') ->select('id', //省略) //省略 ->where('id',$id) ->get(); DB::commit(); LOG::debug($datas); //ログではデータ取得を確認 } }else{ $datas = DB::table('table_2') ->select('id', //省略) //省略 ->where('id',$id) ->get(); } }catch(Exception $e){ DB::rollBack(); //エラー時処理 } return view('blade')->with("datas",$datas);
試したこと・調べたこと
上記の詳細・結果
・ログ出力でデータを取得できていることまでは確認できました。
・トランザクション内のSELECT文の実行場所は、COMMITの前後を試しました。
補足
質問掲載にあたりテーブル名やデータ名はダミーのものに変更しております。
0 コメント