Laravelで1対1のリレーションをする方法。【hasOne】
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
Laravel で1対1のリレーションをしてデータを取り出していきます。
リレーションとは? とは
データベースのテーブル間で関係性のあるデータのことを指します。
今回の例で言えば、user_id を保存しておけば、users テーブルから user データを参照することができ るようなことです。
Laravel では、少しの定義でこれを簡単に実装することができます。
検証環境
Laravel 6
テーブル設計
users テーブル側が 1
user_details テーブルも1(details テーブルの方に、user_id を保存しています。)
という関係の時です。
モデルに書く
モデルの User.php を修正します。
class User extends Model
{
public function userDetail()
{
return $this->hasOne('App\UserDetail');
}
}
1対多が hasMany に対して、hasOne で1対1なので、覚えやすいです。
コントローラーには、
use App\User;
~~~~~~~~
public function index()
{
$users = User::with('userDetail')->take(5)->get();
// dd($users);
return view('home');
}
これで OK です。with('モデルで定義した関数名')をして Eager ロードします。
表示(views)
@foreach($users as $user)
{{ $user->name }}
{{ $user->userDetail->address }}
@endforeach
このようにすれば、ユーザーの名前とリレーションして得た詳細テーブルの住所も取得することができます。
一応逆パターン(user_details⇨users)もある
モデルに書きます。UserDetail.php
class UserDetail extends Model
{
public function user()
{
return $this->belongsTo('App\User');
}
}
コントローラーに書きます。
public function index()
{
$users = UserDetail::with('user')->take(5)->get();
// dd($users);
return view('home');
}
1対多の反対(多対1)でやったときの belongsTo を使うと逆ができます。
多対1のときと同様に、自分のテーブルに user_id があれば belongsTo が使えますよ〜ってことですね。
今回の詳細テーブルの場合、詳細から user をリレーションするケースは稀かもですが、こういう hasOne の逆パターンは可能性としては0ではないかと思います。
まとめ
いかがだったでしょうか?
以上がリレーションについて、僕なりにわかりやすくまとめた記事となります。
1対1のリレーションにビビらなくなると、テーブル設計で「管理しやすい手段」を選択しやすくなると思うので(users にめっちゃ情報載せるとかしなくなる)、結構使うケースが多いんじゃないかな?と思います!
感想や誤字などありましたら、TwitterDM からご連絡お願いします。
関連記事
Laravel で1対多のリレーションをして保存、表示する方法【hasMany】
Laravel で多対1のリレーションをして保存、表示する方法。1対多のときの逆【belongsTo】
Laravel で多対多のリレーションをして保存、表示する方法【belongsToMany】
人気記事