みなさん、こんにちは。真面目にC言語を学ぼうかと検討中のt-odaです。

今回からLaravelの中級者向けのチュートリアルを解説していこうと思います。中級者向けといってもやってることは初心者向けのチュートリアルとほとんど変わりありません!ただ、初心者向けでやったことは軽い説明になると思います。なので、初心者向けを見ていない人はそちらから見ることをお勧めします!

今回の目標は、準備とリレーションです。

さて、構築するアプリケーションは初心者向けと同じですが違っていることを先に挙げましょう。

初心者向けとの違い

  • ユーザー登録
  • ログイン認証
  • リレーション(タスクとユーザー)
  • コントローラー
  • 認可
  • リポジトリー
  • ソフトデリート(公式にはない)

挙げてみるとちょっと多いですかね。それと、公式のチュートリアルにはないのも入ってますね。でも簡単なんで問題ないと思います!

また、見た目はそんなに変わらないんでビューは基本的に使いまわしです。画面数で言えばユーザー登録とログインの2つが増えただけですね。

アプリケーションの設置

まずはアプリケーションをインストールしましょう。復習も兼ねて次のコマンドをホームディレクトリで実行します。初心者向けでtodolistディレクトリを作成している場合はディレクトリ名を変えないとエラーになります。

$ composer create-project laravel/laravel todolist 5.1 --prefer-dist

.envファイルを編集してご自分の環境に合わせましょう。

APP_KEYSomeRandomStringになっている場合は次のコマンドを実行します。

$ php artisan key:generate

それと、DB_CONNECTIONはお使いのDBに合わせて追加しましょう。デフォルトはMySQLですが、postgreSQLを使うならDB_CONNECTION=pgsqlとしましょう。

DBの準備

次はDB周りですね。

ユーザーテーブルとタスクテーブルを作りましょう。以下、ターミナルで実行してください。

$ php artisan make:model Task -m

これでタスクのモデルファイルとマイグレーションファイルが作成されます。

ユーザーのモデルファイルはすでありますね。もっと言うと、ユーザー登録やログイン認証もすでに用意されているのでこれを使います。

では必要なカラムを設定していきましょう。タスクテーブルは次のように設定します。

ここで$table->softDeletes();がありますね。削除する時にデータそのものを削除する物理削除ではなくデータ自体は存在するけど削除したことにする論理削除のためのカラムです。これは、timestamp型でdeleted_atというカラム名になります。コントローラーで削除処理の時にもまた解説しますが、ここでは論理削除のために必要なので作っておくって認識で大丈夫です。また、user_idはint型でインデックスも作成しています。

ユーザーテーブルはすでに用意されているのを利用するのでデフォルトのままで大丈夫です。

テーブルの定義が終わればコマンドを実行してテーブルを作ります。これも初心者向けでやりましたね。

$ php artisan migrate

tasksとusersとその他のテーブルが作成されていればOKです。

モデル

データベースが完成したら次はモデルを編集します。モデルファイルはTask.phpUser.phpですね。編集するのはTask.phpだけです。次のように編集しましょう。

通常のモデルクラスですが複数代入の指定がありますね。この複数代入とは配列を指定することでキーと同じ名前のインスタンスのプロパティーに値を代入してくれる機能のことです。

仮にユーザーテーブルのカラムがnameとpasswordとrole(権限)で、ウェブページでのフィールド(入力する項目 )はnameとpasswordだけだったとしましょう。しかし、ウェブページのHTML構造なんてF12を押して変えることができるのでroleのフィールドを追加するとどうでしょう。roleの値も送信することになります。

本来であればnameとpasswordの値だけが必要なのに余計な値も登録されることになり、下手をすると管理者の権限でユーザー登録される可能性があります。

複数代入は便利ですが意図しない挙動を正常とみなしたままアプリケーションが動作する可能性があるということです。

これを防ぐために、$filleableに複数代入するキーを指定しなければならないのです。ちなみに指定方法は$fillable$guardedの2種類です。

$fillableはホワイトリスト方式で、ここで指定したキー”のみ”を複数代入します。$guardedはブラックリスト方式で、ここで指定したキー”以外”を複数代入します。

複数代入の指定方法

  • $fillable:ホワイトリスト方式
  • $guarded:ブラックリスト方式

リレーション

モデルの定義ができれば次はリレーションです。モデルを関連付ける必要がありますね。

ユーザーは複数のタスクを持ちますがタスクは必ず一人のユーザーに属することになります。リレーショナルデータベースでは1対多とか言ったります。

ということなので、User.phpを次のように編集しましょう。ちなみにすでにあるコメントは消しました。

tasks()というメソッドを定義します。このメソッド名はなんでもいいですけど、複数のタスクを持つという意味でtasks()にします。

そして、Eloquentで用意されているhasMany()でリレーションを定義します。UserクラスはTaskクラスのインスタンスを複数持ちます。よって、引数にはTaskクラスを指定しましょう。

次に、逆のリレーションです。タスクは一人のユーザーに属するというリレーションを定義するために、Task.phpを次のように編集しましょう。

これもEloquentで用意されているbelongsTo()メソッドを利用します。引数はUserクラスです。

便利なリレーションですが、定義する時の注意点があります。

hasMany()はどの外部キーで判断しているのかということです。hasMany()だけでなくリレーションに関するメソッドを利用する時はこれに気を付けましょう。

デフォルトは、引数に指定したクラス自身のクラス名に_idサフィックスをつけたカラムになります。今回で言えばuser_idがそうですね。

しかし、別のカラムを外部キーに指定したい時もありますね。その時は第2引数を指定すればOKです。

belongsTo()も同様です。

リレーションに関するメソッドはたくさんあるので公式のページを一読するといいかと思います。

リレーションに関するメソッドの引数

  • 第1引数:リレーション対象のクラス
  • 第2引数:外部キー(デフォルトは「対象のクラス名_id」)

リレーションを定義すると何が便利ってSQLのjoinとか考えなくてもいいということですね。裏でいろいろ動いているんでちょっと複雑なSQLだと使いづらくなりますが、今回のように指定したユーザーが持っているタスク情報の取得という簡単なものであれば、リレーションを定義したほうが楽ですしスッキリします。

次回予告

次はユーザー登録と認証とログアウトについてです。これらの機能は用意されているものですが、少しだけ深く見ていきます。またトレイトというPHPの機能がでてきますので、そちらについても公式やQiita等を見ておくと理解が早まると思います。