ホーム > Laravel > Laravelで1対1のリレーションをする方法。【hasOne】
Laravel

Laravelで1対1のリレーションをする方法。【hasOne】

いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。

⇨ Laravel 記事の目次はこちら

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】

人気記事

PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする