【Laravel7】テーブルを結合するとidカラムが消える問題
以下のようなテーブル同士を結合しようとコードを書いたが、postsテーブルのidを残したいのに、usersテーブルのidが残ってしまった。
ユーザー情報を登録するためのusersと、投稿の情報を登録するpostsテーブルがあり、postsには投稿したユーザーを記録するための user_idカラムがある。
対処法
$posts = Post::select(
'posts.id',
'users.username',
'category_id',
'user_id',
'subject',
'body1',
'body2',
'body3',
'posts.created_at',
'posts.updated_at')
select文の中に、抽出したいカラムを書いていく。
その際、idを「'posts.id'」と書けばpostsテーブルのidを取ってくることができる。
続けて一覧ページで表示させたいカラムを書いていく。
select()の中に1つでもカラムを書いてしまうと、ほかも書かないと取ってきてくれなくなるため、必要なカラムは全部書く必要がある。
ちなみに、asを使ってカラムに別の名前をつけて重複しないようにする方法もある。
select('post.id as post_id')
postsのidに、post_idという名前をつけることができる。
今回は、postsのidだけ取れればよかったのでasは使わなかったが、usersのidも同時に取りたい場合は、名前をつけて重複しないようにしよう。
テーブル情報と詰まった部分について
usersテーブル
id
username
name
email
email_verified_at
password
remember_token
created_at
updated_at
deleted_at
postsテーブル
id
category_id
user_id
subject
body1
body2
body3
is_deleted
created_at
updated_at
結合する際のコード
$posts = Post::select()
->join('users','posts.user_id','=','users.id')
->categoryAt($category_id)
->orderBy('posts.created_at', 'desc')
->paginate(10);
結合結果
"id" => 11
"category_id" => 2
"user_id" => 11
"subject" => "aaa"
"body1" => "aa"
"body2" => "aa"
"body3" => "aa"
"is_deleted" => null
"created_at" => "2021-01-21 21:03:02"
"updated_at" => "2021-01-26 23:06:16"
"username" => "test1"
"name" => "田中剣"
"email" => "test1@gmail.com"
"email_verified_at" => "2021-01-26 23:05:20"
"password" => "$2〜〜〜"
"remember_token" => "XIwqRfhrzixB9〜"
"deleted_at" => null
結合結果のidを見ると、postsのidを表示したいのに、userのidが表示されている。
"id" => 11
"category_id" => 2
"user_id" => 11
これが原因で、投稿記事一覧ページから記事詳細ページに飛ぶ際、postsのidではなく、usersのidがパラメータに付加されるため、404エラーになってしまった。
対処法の欄で書いた方法にすると、ちゃんとURLパラメータにpostsのidが付加され、記事詳細画面に飛ぶようになる。
この記事が気に入ったらサポートをしてみませんか?