Ikeda's Blog

LaravelでDBから取得した主キーがおかしい

前提条件

以下のような設定でテーブルを作成していた。
先に言ってしまうと、主キーが文字列なことが問題点。

Schema::create('members', function (Blueprint $table) {
    $table->string('id', 50)->primary();
    $table->text('name');
    $table->timestamps();
    $table->softDeletes();
});

データ内容

id name
a.ikeda Ikeda A
b.ikeda Ikeda B

データを取得し、内容を表示すると……

dump(Member::all()->toArray());
array:2 [▼
  0 => array:5 [▼
    "id" => 0
    "memo" => "Ikeda A"
  ]
  1 => array:5 [▼
    "id" => 0
    "memo" => "Ikeda B"
  ]
]

idが「0」になってしまう。

原因

ドキュメントの Eloquent ORM > Eloquentの準備にある、「主キー」

さらに、Eloquentは、主キーが増分整数値であることも想定しています。これは、Eloquentが主キーを自動的に整数にキャストすることを意味します。

そのまま書いてありました。主キーを整数にキャストしてしまうため、文字列だけ入れていると「0」になってしまうのでした。
そして、解決方法も同じように書いてあります。

非インクリメントまたは非数値の主キーを使用する場合は、モデルにpublicの$incrementingプロパティを定義し、falseをセットする必要があります。

モデルの主キーが整数でない場合は、モデルにprotectedな$keyTypeプロパティを定義する必要があります。このプロパティの値はstringにする必要があります。

の2箇所です。

対策

app\Models\*****.phpに、以下の記述を追加することで解決します。

<?php

class Member extends Model
{
    public $incrementing = false; // モデルのIDを自動増分するか
    protected $keyType = 'string'; // IDのデータ型

    // 以下省略
}