B3S
menu close

PHP

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


ぽんて

更新日:2022/07/07


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()を使わない!

updateOrInsertを利用する!

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

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

おまけ

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

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