【Laravel5】EloquentでMutators,Scopes

【Laravel5】EloquentでMutators,Scopes

Lizard Lake

【Laravel5】EloquentでMutators,Scopes

Dates, Mutators, and Scopes – Laravel5 Fundamentalsを元に付加情報をつけて記載しています。

GitHubにサンプルプロジェクトがあります。

ryo-ogata/learning-laravel-5

EloquentでのDateの扱いに慣れる

前回、Articlesテーブルのpublished_atカラムは動的な日付フィールドとして実装しました。

今回はこの日付フィールドを利用します。

  1. published_atをHTMLに移動する

    published_atは、Controllerで現在日をセットしてから、データベース保存していましたが、通常は画面から入力したいことが多いはずです。画面に入力のためのテキストフィールドを追加します。

    • app/Http/Controllers/ArticlesController.php

    • resources/views/articles/create.blade.php

      published_atのためのテキストフィールドを追加します。

      PHPデフォルトのdateメソッドで初期値を与えています。

  2. 確認する。

    http://127.0.0.1:8000/articles/create

    フィールドが1つ増えていることがわかります。このまま入力して登録まで行ってみます。

    【Laravel5】EloquentでMutators,Scopes
    【Laravel5】EloquentでMutators,Scopes

    登録できました。しかし、published_atの降順で並んでいるはずの記事なのに、今登録した記事が末尾にきています。

  3. データベースを確認する。

    ローカルマシンからVMにログインします。

    DBを確認します。MySQLの場合、さきほど登録したレコードの時分秒の部分が00:00:00となっています。

ArticleモデルにMutatorを追加する

  1. 登録の際に、時分秒がセットされるようにする。
    • app/Article.php

      published_atがこのモデルにセットされるとき、このメソッドが呼ばれるようになります。

  2. 確認する。

    再度、登録してみます。

    http://127.0.0.1:8000/articles/create

    【Laravel5】EloquentでMutators,Scopes
    【Laravel5】EloquentでMutators,Scopes
    【Laravel5】EloquentでMutators,Scopes
    【Laravel5】EloquentでMutators,Scopes
  3. データベースを確認する。

    今度は時分秒まで登録することができました。

Scopesを使って記事らしくしてみる

現在日がpublished_atよりも未来日の記事のみ、表示するには以下のように条件を追加します。

  • app/Http/Controllers/ArticlesController.php

これをもっと簡単に、かつControllerではなく、Modelに書いてみましょう。

  1. Controllerを修正する。
  • app/Http/Controllers/ArticlesController.php

  1. ArticleモデルにScopeメソッドを追加する。

  2. 確認する。
    【Laravel5】EloquentでMutators,Scopes
    【Laravel5】EloquentでMutators,Scopes

 まとめ

MutatorとScopesを実装しました。とても簡単につかうことができますね。

必要なメソッドをモデルにおくことで、Controllerをとても簡素化することもでき、実用的かと思います。

次回は、ControllerのValidationについて紹介したいと思います。

コメントを残す

メールアドレスが公開されることはありません。

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax