LoginSignup
70
61

More than 3 years have passed since last update.

Laravelのリレーション(hasOne、hasMany、belongsTo)

Last updated at Posted at 2019-12-08

はじめに

以前正規化とはで学んだように、効率よくデータを扱うためデータを一定のルールに基づいてテーブルを変形し整理しましたが、分割したテーブルにある内容を1つのviewで表示するための手続きについてまとめます。
スクリーンショット 2019-12-08 17.19.35.png
テーブル同士にリレーションを持たせることにより、例えば【people】テーブルと【lendings】テーブルの内容を1つのviewで表示できます。

Laravelのリレーションの種類

Laravelではテーブルに対応したModelを定義することにより、関連を明示することでデータをうまく扱うことができます。
テーブル同士の関連の種類は、1対1、1対多、多対多、その他にも関係の構文があります。

hasOne(1対1)について

hasOneは主テーブルのあるレコードに対して、従テーブルの1つのレコードが紐付けられるときに用いられます。
スクリーンショット 2019-12-08 18.32.17.png

例えば上記のような場合です。
主テーブルのある人に対して従テーブルのパスポート情報は1つしか持ちません。

hasOne(1対1)の記述について

models/Person.php
public function lending()
{
  return $this->hasOne('App\Models\lending');
}
person/index.blade.php
{{$item->passports->getData()}}

hasMany(1対多)について

hasManyは主テーブルのあるレコードに対して、従テーブルの複数のレコードが紐付けるときに用いられます。
スクリーンショット 2019-12-08 17.19.35.png
例えば上記のような場合です。
主テーブルのある人に対して従テーブルの貸出情報は複数もちます(もつ場合もあります)。

hasMany(1対多)の記述について

models/Person.php
public function lendings()
{
  return $this->hasMany('App\Models\lending');
}
person/index.blade.php
@foreach ($item->$lending as $obj)
  <tr>{{$obj->getData()}}</tr>
@endforeach

belongsToについて

belongsToは従テーブルの複数レコードに対して、主テーブルの1つのレコードが紐付けるときに用いられます。
*※hasOneやhasManyは主テーブルから関連する従テーブルのレコードを取り出すものでしたが、belongsToは逆に従テーブルから関連する主テーブルのレコードを取り出すものです。
スクリーンショット 2019-12-08 17.19.35.png
例えば上記のような場合です。
従テーブルの複数の貸出情報に対しては主テーブルのある人をさします。

belongsToの記述について

models/lending.php
public function person()
{
  return $this->belongsTo('App\Models\Person');
}
public function getData()
{
  return $this->id.': ' .$this->person->name.' 貸出日:'. $this->id;
}

おわりに

正規化したデータをリレーションによって関連付けすることに整理されたまま扱えますね。

70
61
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
61