Laravelで投稿の個別ページが表示できないエラー(原因はidのカラム名)

2025.04.15

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が見つからないというものだ。

四苦八苦していた結果、改善できたので、メモとして残しておく

今回使ったファイル

まず、投稿を個別で表示するために用意したファイルは下記の通りだ。

    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式なのだとか。

テスト段階のものなので、変更は直接手動で行ったが、プロジェクトを開始したときはマイグレーションで管理した方が無難だ。

PIC UP