0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel】Eloquentで更新をかけるとIllegal offset typeが発生する

Last updated at Posted at 2024-05-04

発生した問題

以下でDBの更新、新規データ登録をしようとすると「Illegal offset type」が発生した。

public function updateSkillAction($datas,$skillId){
        for($i=0; $i< count($datas->action_index); $i++){
            if($datas->exist_action_flag[$i] === 1){ 
                SkillAction::where([
                    'skill_action_id'=>$datas->skill_id,
                    'action_index'=>$datas->action_index[$i]
                ])->update([
                    'skill_action_name' => "スキルアクション名",
                    'skill_action_discription' => "スキルアクション説明",
                    'skill_action_type' => $datas->action_type[$i],
                    'data_table' => $datas->data_table[$i],
                    'side' => $datas->side[$i],
                    'condition_lenght' => $datas->condition_lenght[$i],
                ]);
            }else{
                Log::debug(print_r($datas->condition_lenght, true));
                SkillAction::create([
                    'skill_action_id' => $skillId,
                    'action_index' => $datas->action_index[$i],
                    'skill_action_name' => 'スキルアクション名',
                    'skill_action_discription' => 'スキルアクション説明',
                    'skill_action_type' => $datas->action_type[$i],
                    'data_table' => $datas->data_table[$i],
                    'side' => $datas->side[$i],
                    'condition_lenght' => $datas->condition_lenght[$i], ←ここ
                ]);
            }
        }
    }

色々調べてみたが、「←」の箇所以外の「'action_index' => $datas->action_index[$i],」~「'condition_lenght' => $datas->condition_lenght[$i],」を削除してもエラーは変わらなかった。

Illegal offset type自体は、何かが配列型でプロパティの参照が上手くできない場合に発生するエラーとのこと。

原因

このコード自体には問題はなく、Model側に問題があった。

<?php

namespace App\Http\Model\BaseMaster;

use Illuminate\Database\Eloquent\Model;

class SkillAction extends Model
{
   //スキルに紐づくスキルアクション情報
   protected $table = 'skill_action_info';
   protected $primaryKey = ['skill_action_id','action_index'];
   
   protected $fillable= [
       //スキルアクションID
       'skill_action_id',
       'action_index',
       //スキルアクション名
       'skill_action_name',
       //スキルアクション説明
       'skill_action_discription',
       //スキルアクションタイプ
       'skill_action_type',
       //効果値計算式
       'data_table',
       //敵味方どちらか(T=味方、F=敵)
       'side' ,
       //条件判定時のアクション数
       'condition_lenght'
   ];
}

問題は「$primaryKey」の部分。
ここが複合キーやAutIncrementのカラムになっていると、今回のようなエラーが発生するらしかった。
以下をModelに追加することで、エラー無く更新処理ができるようになる。
AutoIncrementを無効にするオプション。

   public $incrementing = false;

調べるのにかなり時間をかけてしまったので、どの修正をしたらエラーが発生しだしたか切り分けられるようにこまめな動作確認は必要かも・・・。

参考

以下に書いてある通り、AutIncrement想定で複数のキーを設定していたが、
PHP側で'skill_action_id','action_index'どちらも指定して、しかもskill_action_idとaction_indexは1対多なのがいけなかったと思われる。

自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティを用意し、falseをセットしてください。

2024/6/1 追記複合キー利用で問題が発生したため単一キーに付け替える対応

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?