【Laravel】不要な項目はEloquentのhiddenでカットしよう

こんにちは。画面に表示しないデータベース項目を取得しないように毎回項目指定するのめんどくせーと思ったことはありませんか?今回はそんな悩みを解決してくれるEloquentの機能を紹介したいと思います。

データベースの管理項目って普段取得する必要無いですよね?

データベースのテーブルにトラブル時の調査用に管理項目を作ることありますよね?例えば、最終更新日時や、更新ユーザーなどの情報です。これらは内部調査用の情報であり、画面に表示するケースは少ない場合が多いです。クエリで毎回除外するのも面倒くさいですよね?そこで朗報です!LaravelのEloquentでは不要な項目を常に除外することができます。

モデルのhiddenに設定するだけ

不要な項目をEloquentモデルのhiddenプロパティに設定すると、指定した項目は常に取得対象外となります。元々あるUserプロパティに設定してみましょう。

class User extends Model
{
    use HasFactory, SoftDeletes;

	protected $hidden = []
}

こんな感じで$hiddenをオーバーライドします。今の状態では$hiddenが空の配列なので、Userモデルを取得すると以下のように全ての項目が取得されます。

>>> User::find(1)->toArray();
=> [
     "id" => 1,
     "name" => "joe",
     "email" => "joe@xxx.xxx",
     "email_verified_at" => null,
     "password" => "",
     "remember_token" => null,
     "created_at" => null,
     "updated_at" => "2021-07-31T05:18:34.000000Z",
     "deleted_at" => null,
   ]

試しにcreated_atとupdated_at、deleted_atをhiddenに設定してみましょう。

class User extends Model
{
    use HasFactory, SoftDeletes;

	  protected $hidden = [
		    'created_at',
		    'updated_at',
		    'deleted_at'
	  ];
}
>>> User::find(1)->toArray();
=> [
     "id" => 1,
     "name" => "joe",
     "email" => "joe@xxx.xxx",
     "email_verified_at" => null,
     "password" => "",
     "remember_token" => null,
   ]

toArrayを実行したあと、$hiddenに設定した項目が消えているのがわかります。

hiddenに設定した項目を一時的に表示する

hiddenに設定した項目を一時的に表示するにはmakeVisibleメソッドを使用します。hiddenに設定した項目の内、created_atのみを表示してみます。

>>> User::find(1)->makeVisible(['created_at'])->toArray();
=> [
     "id" => 1,
     "name" => "joe",
     "email" => "joe@xxx.xxx",
     "email_verified_at" => null,
     "password" => "",
     "remember_token" => null,
     "created_at" => null,
   ]

created_atのみ表示できました。

まとめ

今回は通常取得しない項目を設定する方法を解説しました。テーブルの管理項目は通常全てのテーブルに配置するので、私は開発のはじめにモデルに一律でhidden設定してしまうことが多いです。取得したい場合はmakeVisibleで取得できるので、怖がらずに設定してしまっています。APIを不要なデータが流れることが無くなるのでパフォーマンスの向上にも繋がります。皆さんも是非活用してみてください。

Laravel

Posted by kobainmac