タイトル: Illegal offset type
SEOタイトル: 【Laravelエラー】Illegal offset type
エラー内容
|
ErrorException (E_WARNING) Illegal offset type |
このエラーの意味
配列やコレクションのキーに、文字列や整数ではない値を使おうとしたときに発生するエラーです。
PHP では、配列のキーに使えるのは基本的に文字列か整数です。
よくある発生例
たとえば、オブジェクトや配列そのものをキーとして渡していると発生します。
|
$key = ['id' => 1]; $value = $array[$key]; |
この例では $key が配列なので、配列のキーとして使えません。
Laravel で起きやすい場面
- Eloquent モデルを配列キーのように扱っている
find()や配列アクセスに、スカラー値ではなく配列やオブジェクトを渡している- 複合主キーを無理に Eloquent で扱っている
複合主キーとの関係
Laravel / Eloquent は複合主キーの扱いが得意ではありません。
そのため、複合主キー前提のモデルに対して通常のキー取得の書き方をすると、このエラーや周辺の不整合が出ることがあります。
たとえば次のように、配列形式でキーを渡す実装はそのままでは扱いにくいです。
|
$id = ['key1' => 'A', 'key2' => 'B']; $row = SampleModel::find($id); |
対処法1: キーに使う値を見直す
まずは配列アクセスや検索条件に渡している値が、本当に文字列か整数かを確認します。
dd() や var_dump() で値の型を見ると切り分けしやすいです。
対処法2: 複合主キーを前提にしない形へ寄せる
可能であれば、Eloquent モデルには単一主キーを持たせ、複合条件は通常の where() で書く方が安定します。
|
$row = SampleModel::where('key1', $key1) ->where('key2', $key2) ->first(); |
対処法3: Collection のキー指定も確認する
コレクションの get() や配列アクセスでも、オブジェクトや配列をそのままキーにすると同じ問題になります。
キーに使う値だけ取り出してからアクセスしてください。
まとめ
Illegal offset type は、キーに使えない型を配列やコレクションに渡しているのが原因です。
Laravel では特に、複合主キーを Eloquent にそのまま背負わせている場合に起きやすいので、単一主キー + where() ベースに寄せると安定しやすくなります。