ここでは,学部の個別情報を表示するページを作成する.また,学部情報を更新(変更)するフォームを作成する.学部情報の更新では,所属キャンパスも変更できるようにする.このとき,存在しない(新たな)キャンパスの登録を拒否したり,許可したりする方法についても解説する.
ここでは,学部個別の情報を表示するページを作成しよう.まず,ルートを定義する.たとえば,/faculties/1 では id = 1 の栄養学部のページを表示する.
routes/web.php (抜粋)
Route::get('/campuses', 'CampusesController@index');
Route::get('/faculties', 'FacultiesController@index');
Route::get('/faculties/{id}', 'FacultiesController@show');
Route::get('/students', 'StudentsController@index');
Route::get('/lectures', 'LecturesController@index');
次は,コントローラに show 関数を追加する.まずは,引数だけを表示するようにしておこう.
app/Http/Controllers/FacultiesController.php (抜粋)
class FacultiesController extends Controller
{
public function index()
{
$faculties = Faculty::get();
return view('faculties.index')
->with('faculties', $faculties);
}
public function show($id)
{
dd($id);
}
}
/faculties と /campuses のページに /faculties/{id} へのリンクを設置する.ビューを次のように変更すれば良い.
resources/views/faculties/index.blade.php (抜粋)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>学部一覧</title>
</head>
<body>
<h1>学部一覧</h1>
<ul>
@foreach ($faculties as $faculty)
<li><a href="{{ action('FacultiesController@show', $faculty->id) }}">{{ $faculty->faculty }}</a>は{{ $faculty->established }}年に設置され,キャンパスは {{ $faculty->campus->campus }} です</li>
@endforeach
</ul>
</body>
</html>
resources/views/campuses/index.blade.php (抜粋)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>キャンパス一覧</title>
</head>
<body>
<h1>キャンパス一覧</h1>
<ul>
@foreach ($campuses as $campus)
<li>{{ $campus->campus }}</li>
<ul>
@foreach ($campus->faculties as $faculty)
<li><a href="{{ action('FacultiesController@show', $faculty->id) }}">{{ $faculty->faculty }}</a></li>
@endforeach
</ul>
@endforeach
</ul>
</body>
</html>
これによって,下図のように /faculties や /campuses から /faculties/1 などへリンクされるようになった.
次は FacultiesController の show を編集して,学部情報を実際に取得しビューに渡す処理を記述する.
app/Http/Controllers/FacultiesController.php (抜粋)
public function show($id)
{
$faculty = Faculty::where('id', $id)
->first();
if (!$faculty) { // 学部を取得できない(IDが不正の)場合はリダイレクト
return rediect('/faculties');
}
return view('faculties.show')
->with('faculty', $faculty);
}
resources/views/faculties/show.blade.php を作成し,次のような内容を記述する(index.blade.php とほとんど同じなので,コピーして一部を修正するだけでも良い).
resources/views/faculties/show.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>{{ $faculty->faculty }}</title>
</head>
<body>
<h1>{{ $faculty->faculty }}</h1>
<p>キャンパスは {{ $faculty->campus->campus }} です.</p>
</body>
</html>
これで学部詳細情報の表示ページができました.
学部詳細情報のページから情報編集のページへリンクを作成しよう.まずはルートの定義を行う.ここでは,編集画面を表示するための定義と,編集画面で「更新」ボタンを押した後の処理を行うための定義を追加しておく.
routes/web.php (抜粋)
Route::get('/campuses', 'CampusesController@index');
Route::get('/faculties', 'FacultiesController@index');
Route::get('/faculties/{id}', 'FacultiesController@show');
Route::get('/faculties/{id}/edit', 'FacultiesController@edit');
Route::patch('/faculties', 'FacultiesController@update');
Route::get('/students', 'StudentsController@index');
Route::get('/lectures', 'LecturesController@index');
学部詳細ページには編集画面へのリンクを設置しておく.
resources/views/faculties/show.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>{{ $faculty->faculty }}</title>
</head>
<body>
<h1>{{ $faculty->faculty }}</h1>
<p>キャンパスは {{ $faculty->campus->campus }} です.</p>
<hr>
<p><a href="{{ action('FacultiesController@edit', $faculty->id) }}">[編集]</a></p>
</body>
</html>
コントローラに edit と update 関数を追加する.なお,update 関数は更新ボタンが押されたときに,どのような情報が渡されてくるかを確認するためだけのコードを記述しておき,まだ実際にデータベースを更新しないようにしておく.
app/Http/Controllers/FacultiesController.php (抜粋)
public function edit($id)
{
$faculty = Faculty::where('id', $id)
->first();
if (!$faculty) { // 学部を取得できない(IDが不正の)場合はリダイレクト
return rediect('/faculties');
}
return view('faculties.edit')
->with('faculty', $faculty);
}
public function update(Request $request)
{
dd($request);
}
resources/views/faculties/edit.blade.php を作成し,次のような内容を記述する.
resources/views/faculties/edit.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>{{ $faculty->faculty }}の編集</title>
</head>
<body>
<h1>{{ $faculty->faculty }} の編集</h1>
<div>
<form method="post"
action="{{ action('FacultiesController@update') }}"
enctype='multipart/form-data'>
{{ csrf_field() }}
{{ method_field('patch') }}
<input type="hidden" name="id" value="{{ $faculty->id }}">
<p>
<label for="faculty">学部名:</label>
<input type="text" name="faculty"
id="faculty"
value="{{ $faculty->faculty }}{{ old('faculty') }}">
</p>
<p>
<label for="campus">キャンパス:</label>
<input type="text" name="campus"
id="campus"
value="{{ $faculty->campus->campus }}{{ old('campus') }}">
</p>
<p>
<input type="submit" value="更新">
</p>
</form>
</div>
</body>
</html>
これまでの作業の結果,学部詳細ページの[編集]リンクをクリックすれば,編集画面で学部名とキャンパスを編集できるフォームが表示されるようになり,
また,「経営学部」を「経営学部経営学科」に書き換え,キャンパスを「KAC」に書き換えて「更新」ボタンをクリックすれば,その情報が update 関数に渡されて,「request」の「ParameterBag」の中に格納されていることが確認できた(まだ,実際にデータベースを更新をしているわけではないことにも注意しよう).
では実際にデータベースの更新を行う処理を記述しよう.コントローラの update 関数にその処理を記述する.なお,ここでは,存在しないキャンパスを入力した場合には,一切の変更を加えないような処理を行っている.また, update 関数内で Campus::
を利用するために,コントローラの最初で use App\Campus;
を宣言していることにも注意しよう.
app/Http/Controllers/FacultiesController.php (抜粋)
use Illuminate\Http\Request;
use App\Faculty;
use App\Campus; // <<<<<<------ 追加
(中略)
public function update(Request $request)
{
// 掲示板の例を参考にここで Validation を記述しよう(ここでは省略します.)
$faculty = Faculty::where('id', $request->id)
->first();
$faculty->faculty = $request->faculty;
// 入力されたキャンパスが正しいかどうかをチェックする
$campus = Campus::where('campus', $request->campus)->first();
if (!$campus) {
// 未知のキャンパスなので,一切更新せずに戻る
return redirect()->action('FacultiesController@show', $request->id);
}
// $faculty に campus_id をセットする
$faculty->campus_id = $campus->id;
// データベースを更新する
$faculty->save();
return redirect()->action('FacultiesController@show', $request->id);
}
例えば,「経営学部」を「経営学部経営学科」に,「KPC」を「KAC」に書き換えて「更新」ボタンをクリックすれば,正しく更新できていることが確認できる.
次に,「KAC」を「ポートアイランドキャンパス」に変更しようとしても,そのようなデータが campuses テーブルには存在しないので,変更しないようにできている.
次に,「KAC」から「KPC」への変更はもちろん可能である.
いまの操作((1) 経営学部 → 経営学部経営学科の変更,(2) KAC → KPC の変更)の途中でその都度 sqlite でデータベースの内容を確認すると,次のようになる.ここで,4列目の campus_id が更新され,それと同時に update_at に更新日時が記録されていることに注意しよう.
[GakuinHana@rin06 laravelRelationship]$ sqlite3 database/database.sqlite ⏎ SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from faculties; ⏎ # 更新前 1|栄養学部|1966|1|| 2|法学部|1967|2|| 3|経済学部|1967|1|| 4|薬学部|1972|2|| 5|人文学部|2004|1|| 6|経営学部|2004|2|| 7|総合リハビリテーション学部|2005|1|| 8|現代社会学部|2014|2|| 9|グローバル・コミュニケーション学部|2015|2|| 10|心理学部|2018|1|| sqlite> select * from faculties; ⏎# 最初の更新後 1|栄養学部|1966|1|| 2|法学部|1967|2|| 3|経済学部|1967|1|| 4|薬学部|1972|2|| 5|人文学部|2004|1|| 6|経営学部経営学科|2004|1||2018-06-25 21:27:41 7|総合リハビリテーション学部|2005|1|| 8|現代社会学部|2014|2|| 9|グローバル・コミュニケーション学部|2015|2|| 10|心理学部|2018|1|| sqlite> select * from faculties; ⏎# 2回目の更新後 1|栄養学部|1966|1|| 2|法学部|1967|2|| 3|経済学部|1967|1|| 4|薬学部|1972|2|| 5|人文学部|2004|1|| 6|経営学部経営学科|2004|2||2018-06-25 21:37:12 7|総合リハビリテーション学部|2005|1|| 8|現代社会学部|2014|2|| 9|グローバル・コミュニケーション学部|2015|2|| 10|心理学部|2018|1|| sqlite> .exit ⏎ [GakuinHana@rin06 laravelRelationship]$
上の例では,キャンパスに「ポートアイランドキャンパス」のように存在しないデータを入力した場合には一切更新しないようにした.しかしながら,場合によっては,学部の変更と同時に新たなキャンパスが設置されたものとして,campuses に新たなレコードを追加したい場合もある.たとえば,新たなキャンパス「KSC」が設置されたとして,経営学部経営学科だけを「KSC」に移動させることを考えたい.このような場合は,まず,campuses に新たなレコードを追加し,そのIDを取得して,faculties を更新すれば良い.コントローラの update 関数を次のように変更してみよう.
app/Http/Controllers/FacultiesController.php (抜粋)
public function update(Request $request)
{
// 掲示板の例を参考にここで Validation を記述しよう(ここでは省略します.)
$faculty = Faculty::where('id', $request->id)
->first();
$faculty->faculty = $request->faculty;
// 入力されたキャンパスが正しいかどうかをチェックする
$campus = Campus::where('campus', $request->campus)->first();
if (!$campus) {
// 未知のキャンパスなので,登録する
$new_campus = new Campus();
$new_campus->campus = $request->campus;
$new_campus->save(); // campuses テーブルに新規登録する
$faculty->campus_id = $new_campus->id; // 新規登録したIDをセットする
} else {
// すでに存在するキャンパスの場合は取得したIDをセットする
$faculty->campus_id = $campus->id;
}
// データベースを更新する
$faculty->save();
return redirect()->action('FacultiesController@show', $request->id);
}
実際にKPCをKSCに変更(追加)することができた.
この作業の過程で sqlite で確認すると,データベースの中身は次のようになる.特に,faculties テーブルの経営学部経営学科の campus_id に 3 がセットされるとともに,campuses テーブルには新たなレコードが追加されていることに注意しよう.
[GakuinHana@rin06 laravelRelationship]$ sqlite3 database/database.sqlite ⏎ [GakuinHana@rin06 laravelRelationship]$ sqlite3 database/database.sqlite ⏎ SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> select * from faculties; ⏎# 更新前 1|栄養学部|1966|1|| 2|法学部|1967|2|| 3|経済学部|1967|1|| 4|薬学部|1972|2|| 5|人文学部|2004|1|| 6|経営学部経営学科|2004|2||2018-06-25 21:37:12 7|総合リハビリテーション学部|2005|1|| 8|現代社会学部|2014|2|| 9|グローバル・コミュニケーション学部|2015|2|| 10|心理学部|2018|1|| sqlite> select * from campuses; ⏎# 更新前 1|KAC|| 2|KPC|| sqlite> select * from faculties; ⏎# KSC の追加後 1|栄養学部|1966|1|| 2|法学部|1967|2|| 3|経済学部|1967|1|| 4|薬学部|1972|2|| 5|人文学部|2004|1|| 6|経営学部経営学科|2004|3||2018-06-25 21:55:18 7|総合リハビリテーション学部|2005|1|| 8|現代社会学部|2014|2|| 9|グローバル・コミュニケーション学部|2015|2|| 10|心理学部|2018|1|| sqlite> select * from campuses; ⏎# KSC の追加後 1|KAC|| 2|KPC|| 3|KSC|2018-06-25 21:55:18|2018-06-25 21:55:18 sqlite> .exit ⏎ [GakuinHana@rin06 laravelRelationship]$
キャンパス一覧ページを表示すると,KSC が登録されていることを確認できる(キャンパスを追加してよいかどうかは別問題です.新たなキャンパスの追加を認めない場合もあるでしょう).