概要と結論
リレーション先で検索を行うため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が連番になっているので正しいことがわかる。