Laravel5のEloquentORMで1対多のリレーション(その2)

前回は、gathersテーブルのcategory_idに、categoriesテーブルのidを入力するところまでを作業しました。今日は、実際に1対多のリレーションを使って、データを表示してみたいと思います。

モデルにリレーションの設定

まず、最初にモデルに1対多のリレーション(belongsTo)を設定します。

app/Gather.php

<?php namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Gather extends Model {
 
 //複数代入のホワイトリスト
 protected $fillable=['name','code','description'];
 
 //ソフトデリート
 use SoftDeletes;
 protected $dates=['deleted_at'];
 
 /* 
 * 1対多のリレーション
 * GatherはCagegoryに属しています
 */
 public function category(){
 return $this->belongsTo('App\Category');
 }
}

17-19行目:Categoryモデルに従属のリレーションを設定しています。つまり、ひとつのカテゴリに対してGathersモデルが複数あるということです。

gather->category->プロパティで従属先のプロパティにアクセスできます。

カテゴリ名の表示

それでは、gathersの一覧ページ(index.blade.php)に、カテゴリ名を表示するために下記のように修正します。

app/resources/views/gathers/index.blade.php

@extends('app')
@section('content')
<div class="container">
 <h2>コレクション一覧</h2>
 <table class="table table-striped">
 <tr>
 <th>名前</th>
 <th>カテゴリ</th>
 <th>Code</th>
 <th>説明</th>
 <th>処理</th>
 </tr>
 @foreach($gathers as $gather)
 <tr>
 <td>{{ $gather->name }}</td>
 <td>{{ $gather->category->name }}</td>
 <td>{{ $gather->code }}</td>
 <td>{{ $gather->description }}</td>
 <td>
 <a href="{{url('gathers/update',$gather->id)}}"><span class="glyphicon glyphicon-pencil"></span>修正</a>&nbsp;
 <a href="#" data-toggle="modal" data-target="#deleteModal{{$gather->id}}"><span class="glyphicon glyphicon-remove"></span>削除</a>
 </td>
 </tr>
 <div class="modal fade" id="deleteModal{{$gather->id}}">
 <div class="modal-dialog">
 <div class="modal-content">
 <div class="modal-header">
 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
 <h4 class="modal-title alert alert-danger">『{{$gather->name}}』の削除</h4>
 </div>
 <div class="modal-body">
 <p>本当に削除してもいいですか</p>
 </div>
 <div class="modal-footer">
 {!! Form::open(['url'=>'gathers/delete']) !!}
 {!! Form::hidden('id',$gather->id) !!}
 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
 <input type="submit" class="btn btn-danger" value="削除">
 {!! Form::close() !!}
 </div>
 </div><!-- /.modal-content -->
 </div><!-- /.modal-dialog -->
 </div><!-- /.modal -->
 @endforeach
 </table>
 {!! $gathers->setPath('gathers') !!}<br>
 <a href="{{ url('gathers/create') }}" type="button" class="btn btn-primary btn-lg">新規作成</a>
</div>
@endsection

8行目と16行目を追加しただけです。

16行目:リレーション先のデータを表示しています。

$gather->category->name

つまり、gathersテーブルのcategory_idとcategoriesテーブルのidが一致するデータをcategoriesテーブルから参照し、nameカラムのデータを取得しています。

ブラウザで表示してみましょう。下記のようにcategoriesテーブルのnameカラムが表示されています。

2015-05-24 18-00-01

本日はここまでにします。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ