B3Sロゴ
menu close

PHP

LaravelのSaveメソッドでIllegal offset typeエラーがでた


ぽんて

更新日:2022/02/24


SaveメソッドでIllegal offset typeエラーがでたので少し調査してみた
LaravelでSaveメソッドを利用したとき、Illegal offset typeエラーが発生しました!
正しく使えてるはずなのになぜ!!、ということで原因を調査。
その結果をまとめてみました。
 
 

発生状況

データベース

Modelクラス

 

Controllerクラス

動作内容

期待する動作

Hogeテーブルのfree_textの内容が「hogahoga」に更新される

実際の動作

Illegal offset typeエラーが発生!
 

発生箇所、原因

以下の条件が重なると発生するみたいです

Modelクラス

primaryキーを複数指定する(複合主キー)
 

の行ですね。

Controllerクラス

fillしてからsaveする
 

の行ですね。
save単体では発生しませんでした。
  

ソースを追うと、save()のときに通るwhere句を組み立てる関数でエラーが発生していました!
Laravelでは複合主キーのときにfill()→save()による更新処理はできない仕様(バグ?)のようです。
 

対策

複合主キーのときはfill()->save()を使わない!

updateOrCreateなどを利用する(これらもfillable判定通る)

サロゲートキーを使い、複合主キーになることを避ける!

そもそもLaravelは基本は単一キーを推奨している、ように見える。
であればそもそも複合主キーを使わない設計にするのもありかも
 

おまけ

saveメソッド以外のIllegal offset typeエラー

$primaryを複数指定した場合Modelクラスに「$incremating = false」の設定漏れでも同様のエラーが発生します。
漏れのないようにしましょう!
  

ぽんて