has one結合
2つのテーブルを「1対1」の関係で関連づけられることをいう。
Person.phpに下記を追記する。
public function board()
{
return $this->hasOne('App\Board');
}
関連テーブルの情報を表示するようにテンプレートを修正する。
Person/index.blade.phpを修正する。
@section('content')
<table>
<tr><th>Person</th><th>Board</th></tr>
@foreach ($items as $item)
<tr>
<td>{{$item->getData()}}</td>
<td>
@if ($item->board != null)
{{$item->board->getData()}}
@endif
</td>
</tr>
@endforeach
</table>
@endsection
上記を修正すると下図のようにboardsテーブルと紐づいて表示される。
##has Many結合
Personモデルのboardメソッドを修正する。
public function boards()
{
return $this->hasMany('App\Board');
}
/Person/index.blade.phpを修正する。
@section('content')
<table>
<tr><th>Person</th><th>Board</th></tr>
@foreach ($items as $item)
<tr>
<td>{{$item->getData()}}</td>
<td>
@if ($item->boards != null)
<table width="100%">
@foreach ($item->boards as $obj)
<tr><td>{{$obj->getData()}}</td></tr>
@endforeach
</table>
@endif
</td>
</tr>
@endforeach
</table>
@endsection
修正すると下図のように全ての利用者の投稿が表示される。
belongsTo結合
belongsToとは、従テーブル(boards)から、関連づいている主テーブル(people)のレコードを取り出すこと。
Boardモデルクラスを修正する。
public function person()
{
return $this->belongsTo('App\Person');
}
public function getData()
{
return $this->id . ': ' . $this->title . ' (' . $this->person->name . ')';
}
しかしこのコードを書いても/boardにアクセスするとエラーが発生してしまう。
Trying to get property of non-objectということはプロパティのオブジェクトを取得できないらしい。
[Laravel belongsToでリレーションした主テーブルのプロパティが取得できない]
(https://teratail.com/questions/119544)
この記事によると personからの値を取得するには連想配列にするとうまくいくみたい。
public function getData()
{
return $this->id . ': ' . $this->title . ' (' . $this->person['name'] . ')';
}
出力確認したらこれでOKそう。苦労した。