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のデータ型
// 以下省略
}
2023-01-27 08:00:00
