keigo-uの備忘録

沖縄で情報系の大学に通う大学生の技術ブログです。

クエリビルダでjoinをするとidが変わってしまう問題

概要と結論

リレーション先で検索を行うためleftJoinを用いてテーブルの結合を行ったが、 joinメソッドでは同名カラムが上書きされるため、selectでカラム名を変える必要がある

環境

  • Laravel 9

前提条件

テーブル構成

postsテーブル
int id PK
string title
string body
int category_id FK
categoriesテーブル
int id PK
string name

何をしようとしたのか

リレーション先のテーブルを検索するために結合を行った。

$query = Post::query();
$query->leftJoin('categories', 'posts.category_id', '=', 'categories.id');
$posts = $query->get();

joinとは?

joinメソッドは複数のテーブルを結合し、ひとつにまとめることができます。joinにはjoin(内部結合)、leftJoin(左外部結合)、rightJoin(右外部結合)の3つの種類があり、 Laravelではそれぞれクエリビルダで呼び出すことができます。

実行結果

結合はできているが、idがめちゃくちゃになっている。

実行結果

問題点

joinメソッドでは結合時にカラム名が同じ場合idが上書きされてしまう。 今回の場合、postsテーブルのidとcategoriesテーブルのidのカラム名が同じであったため上書きされていた。

解決策

selectメソッドを使用し、カラム名を変更する。

$query = Post::query();
// [追記]今回はcategoriesのidをcategory_idに変更
$query->select('posts.*', 'categories.id as category_id', 'categories.name');
$query->leftJoin('categories', 'posts.category_id', '=', 'categories.id');
$posts = $query->get();

実行結果

idが連番になっているので正しいことがわかる。

実行結果2