Laravelの投稿を一覧から個別ページに飛ばすプログラムを作っていたが、下記のようなエラーが出た。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (Connection: mysql, SQL: select * from test_futaros where id = 1 limit 1)
参照先のIDが見つからないというものだ。
四苦八苦していた結果、改善できたので、メモとして残しておく
Table of Contents
今回使ったファイル
まず、投稿を個別で表示するために用意したファイルは下記の通りだ。
public function show(TestFutaro $post) {
return view('testFolder.show', compact('post'));
}
コントローラーで依存注入をし、test.01blade.phpの一覧に表示された投稿のタイトルをクリックすると、show.blade.phpに定義した個別ページに飛ぶ想定だった。
Route::get('/testFolder/show/{post}', [Test01Controller::class, 'show'])->name('testFolder.show');
<a href="{{ route('testFolder.show', $post) }}">
{{$post->title}}
</a>
<div class="mt-4 p-1 w-full rounded-2xl bg-gray-100">
<h1 class="p-4 text-lg font-semibold">
{{$post->title}}
</h1>
<hr class="w-full">
<p class="mt-4 p-4">
{{$post->body}}
</p>
<div class="p-4 text-sm font-semibold">
</div>
</div>
しかし、冒頭のエラーが出てしまい、test.01blade.phpへのアクセスができなくなってしまった。
解決方法
結論、コード自体には問題なく、DBのカラムに登録していたIDの値に問題があった。
通常はカラム内に「id」で登録しておくべきものを、「fuu_id」という名前で登録していたが、先ほどのweb.phpの書き方だと、Laravelが自動的に id で対象モデルを検索しようとしているのだ。
つまり fuu_id を渡しても、Laravelは勝手に 「where id = ? 」で探しに行っていたため、かみ合わずにエラーが出たのだ。
IDのカラム名は「id」で良い
ちなみに、「fuu_id」にしていた理由は、外部キー(FK)として使うときに分かりやすくするため、という意図があった。
しかし、LaravelはEloquentが自動でリレーションを理解してくれるため、各テーブルのIDは「id」にするのがLaravel式なのだとか。
テスト段階のものなので、変更は直接手動で行ったが、プロジェクトを開始したときはマイグレーションで管理した方が無難だ。