くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

Laravelでテーブルをjoinで結合してテーブル間でカラム名が被ったときの対処法

Laravelでテーブルをjoinで結合してテーブル間でカラム名が被ったときの対処法

usersテーブル
id, name, class_id

classesテーブル
id, name

各テーブルが上のようなカラムを持っていたとすると、

 $users = DB::table(‘users')
            ->select(‘users.id', ‘users.name', ‘classes.name')
            ->leftJoin(‘classes', ‘users.class_id', '=', ‘classes.id')
            ->get();

こうやった場合、echo $users->name; すると「桜組」みたいな結果が返ってきて本当に欲しかった「太郎」のようなユーザー名がclassesテーブルのnameに上書きされてしまいます。

本来のSQL文ならclasses.name as class_nameとするのですが、Lraravelのドキュメントにはselectメソッドにas … を指定するようなオプションはありませんでした。どうしようかと思って試しに以下のように記述したところ、うまく動作しました。

$users = DB::table(‘users')
            ->select(‘users.id', ‘users.name', ‘classes.name as class_name')
            ->leftJoin(‘classes', ‘users.class_id', '=', ‘classes.id')
            ->get();

ふむ、おそらく’ '内のものをSQL文に投げているだけなので、as以下もそのまま投げられて動いている、って感じでしょうか