LaravelでEloquentを使ってリレーションを設定し、リレーション先のテーブルを取得する方法です。
次のような2つのテーブルがあるとします
・「チーム」(teams)
・「ユーザー」(users)
このようにチームの中に複数のユーザーが所属するとします
─── マイチーム
├── 鈴木 一郎
├── 山田 太郎
├── 中村 二郎
モデル /app/Team.php
/**
* 1対多リレーション
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function users() // 複数形(users)にする
{
// 「is_deleted = 0」のデータを「idの大きい順」で取得する
return $this->hasMany('App\User')->where('is_deleted', 0)->orderBy('id', 'DESC');
}
(取得条件やソート順を指定することができます。)
モデル /app/User.php
public function team() // 単数形(team)にする
{
return $this->belongsTo('App\Team');
}
use App\Team;
$all_teams = Team::with('users')->get();
dd( $all_teams->toArray() );
(実は with() メソッドを指定しなくても、Bladeテンプレートの中で リレーションオブジェクトを呼び出そうとすると自動取得されます。 ただ、自動取得が100回あると100回SQLクエリが投げられるので非効率です。with()メソッドだと in句 で一撃で取得してきます。)
方法1: with() を使ったやり方
$user = User::with('team')->find( Auth::user()->id );
dd( $user->toArray() );
実行されるSQL文
select * from `users`";
select * from `teams` where `teams`.`id` in (?); // ? は プレースホルダ
方法2: LEFT JOIN を使ったやり方
$user = User::leftJoin('teams','teams.id','=','users.team_id')->find( Auth::user()->id );
Mydump::dump( $user->toArray() );
実行されるSQL文
select * from `users` left join `teams` on `teams`.`id` = `users`.`team_id` where `users`.`id` = ? limit 1
$all_users = DB::table('users')
->leftJoin('teams','teams.id','=','users.team_id')
->get();
Mydump::dump( $all_users );
その他リレーションの参考: https://laravel-news.com/eloquent-tips-tricks