プログラミング学習269日目〜Laravel 自動車整備履歴アプリ作成 21日目〜
2つのテーブルのリレーション。
うまくいった確認だけはできました。
思った以上に簡単で、そして便利。リレーションを使わずに同じ結果を得られないこともないのですが、結構面倒かと。
あまりに簡単で便利だったので覚え書きを。
ちなみに今回のリレーションは1対多。
主テーブル名: carinfos(model:carinfo.php)
従テーブル名: maintenances(model:maintenance.php)
主テーブルのカラム: id、maker、model …
従テーブルのカラム: id、carinfo_id、mainte_date …
//carinfo.phpに以下を追記
public function maintenance()
{
return $this->hasMany('App\Models\maintenance');
}
たったこれだけで2つのテーブルのリレーションは完了。
主テーブルのidと従テーブルのcarinfo_idが一致するものを関連付けて取り出せるようになります。今回の場合は主テーブルcarinfosには車輌情報、従テーブルmaintenancesには整備情報を保管しており、例えばidが1の車輌に関してはcarinfo_idが1の整備情報だけを取り出せるようになります。
ちなみに上のコードにはcarinfosのidとmaintenancesのcarinfo_idについて関連付けられているという記述は一切ありません。主テーブルのモデル名に_idを付けたカラムを従テーブルに持たせると自動で関連付けられていると判断するらしいです。もちろん別のカラムを関連付けさせることもでき、その場合は第2引数、第3引数にその内容を記載することにより可能になります。
取り出し方は、コントローラーがこれだとして、
//CarinfoController.php
public function index()
{
$carinfos = carinfo::all();
return view('/carinfo/index', ['carinfos'=>$carinfos]);
}
ビューがこれ。
//index.blade.php
@foreach ($carinfos as $carinfo)
@foreach ($carinfo->maintenance as $obj)
<p>{{$obj->mainte_date}}</p>
@endforeach
@endforeach
イメージとしてはcarinfosという車輌情報の集まりからcarinfoという個別の車輌を取り出したものに、その個別の車輌の整備情報の集まりがぶら下がっているといったところでしょうか。個人的にはそんなイメージです。
体裁を整えればそれっぽいものができそうな気がします。