発生した問題
以下で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 追記複合キー利用で問題が発生したため単一キーに付け替える対応