Laravel入門トップページ


目次

  1. Composerのダウンロードとインストール
  2. コメント掲示板を作成してみよう
  3. リレーションシップを使いこなそう
    1. 概要
    2. Laravelプロジェクトの作成と初期設定
    3. 一対多のリレーションシップ
    4. 多対多のリレーションシップ
    5. ビューを使った表示
    6. 学部の情報を表示・変更する
    7. キャンパスの情報を表示・変更・削除する
    8. 学生の情報を表示・変更・削除する
  4. ユーザ認証の機能を実現しよう
  5. マルチ認証の機能を実現しよう
  6. MongoDB に接続しよう
  7. キューを利用しよう
  8. コマンド(コンソール)を利用しよう
  9. 本番環境にデプロイしよう

リレーションシップを使いこなそう

学部の情報を表示・変更・追加する

目次に戻る

ここでの概要

ここでは,学部の個別情報を表示するページを作成する.また,学部情報を更新(変更)するフォームを作成する.学部情報の更新では,所属キャンパスも変更できるようにする.このとき,存在しない(新たな)キャンパスの登録を拒否したり,許可したりする方法についても解説する.

学部情報の表示

ここでは,学部個別の情報を表示するページを作成しよう.まず,ルートを定義する.たとえば,/faculty/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 などへリンクされるようになった.

edit-faculty-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);
  }

resouces/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>

これで学部詳細情報の表示ページができました.

edit-faculty-2

目次に戻る

学部情報の編集

学部詳細情報のページから情報編集のページへリンクを作成しよう.まずはルートの定義を行う.ここでは,編集画面を表示するための定義と,編集画面で「更新」ボタンを押した後の処理を行うための定義を追加しておく.

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);
  }

resouces/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>

これまでの作業の結果,学部詳細ページの[編集]リンクをクリックすれば,編集画面で学部名とキャンパスを編集できるフォームが表示されるようになり,

edit-faculty-3

また,「経営学部」を「経営学部経営学科」に書き換え,キャンパスを「KAC」に書き換えて「更新」ボタンをクリックすれば,その情報が update 関数に渡されて,「request」の「ParameterBag」の中に格納されていることが確認できた(まだ,実際にデータベースを更新をしているわけではないことにも注意しよう).

edit-faculty-4

では実際にデータベースの更新を行う処理を記述しよう.コントローラの 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」に書き換えて「更新」ボタンをクリックすれば,正しく更新できていることが確認できる.

edit-faculty-5

次に,「KAC」を「ポートアイランドキャンパス」に変更しようとしても,そのようなデータが campuses テーブルには存在しないので,変更しないようにできている.

edit-faculty-6

次に,「KAC」から「KPC」への変更はもちろん可能である.

edit-faculty-7

いまの操作((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に変更(追加)することができた.

edit-faculty-8

この作業の過程で 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 が登録されていることを確認できる(キャンパスを追加してよいかどうかは別問題です.新たなキャンパスの追加を認めない場合もあるでしょう).

edit-faculty-9

目次に戻る