指定したモデルで管理しているパラメータによって処理を変えたい時があります。
判定に使用するパラメータがbool
型であれば、true
かfalse
なので特に迷うことはありません。
しかし、int
型で複数の状態を管理する場合があります。
int型でパラメータを管理する場合はどの数値がどの状態かを考慮する必要があるため、その内訳は設計(実装)した人にしかわかりません。
数字で指定する必要があるとはいえ、マジックナンバーの使用は避けたいものです。
かといってConfigファイルにまとめると、呼び出す度に長い文になってしまい可読性が落ちます。
if($entry->status == Config::get('entry.hoge.fuga....')) {
...
}
数回であればこの記述でも良いかもしれませんが、コントローラを跨いで使いたい場合もあります。
そうなると、毎回このコンフィグから呼び出す記述を書かなければいけないため、さらに管理しずらくなります。
どうせなら、モデルに紐づくものなので、モデル側で判定できれば便利ですよね?
さて、
今回はモデル側に判定用の関数を追加して、モデルからチェーンメソッドで判定関数を呼び出す方法について記載します。
記事の例
今回は、ブログシステムを実装する前提でお話しします。
モデルについて
Blogという名前のモデルを作成します。
マイグレーションで追加するパラメータは次の通りです。
- title(タイトル)
- body(本文)
- status(記事の状態)
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateBlogsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('blogs', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->string('body'); $table->integer('status'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('blogs'); } }
status(記事の状態)は、指定した数値によって次の意味を持ちます。
値 | 状態 |
---|---|
0 | 下書き |
1 | 公開済み |
2 | 公開予定(時間公開) |
判定用の関数
それでは、下書きを判定する関数を実装します。
下書きを判定するには、前項で記述した条件にそって考えるとstatus
が0
であるかどうかを判定します。
モデルのインスタンスからパラメータを取得する方法
モデルのインスタンスを作る、もしくはEloquent ORM(findやwhere()->first等)でモデルを呼び出すと、メンバ変数にデータベースに紐付いたパラメータを格納します。
そのため、$this->status
で記事の状態を呼び出す事ができます。
実装方法
モデルのファイルに、isDraft
という関数作成し、下書きかどうか判定するとします。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; class Blog extends Model { use Notifiable; /** * 下書き状態か判定 */ public function isDraft(){ return $this->status == 0; } }
関数の呼び出し方
これで、モデルを呼び出した後にチェーンメソッドで呼び出す事ができます。
例えば、特定のBlogデータを呼び出して、下書きかどうか判定する場合は下記のようにします。
<?php $blog = Blog::find(1); if($blog->isDraft()) { // 下書きの場合の処理 }
以上です。
モデルの関数にする事で、コントローラーを選ばずに判定できます。
同じ判定処理をコントローラー毎に書かなくてもよいですし、何よりモデルに紐付いて使えるのでとても便利です。