[Laravel] EloquentでAttributeと$appendsを使って、独自定義のフィールドを作る
こんにちは、@yoheiMuneです。
今日はLaravelネタで、Eloquentで独自属性(独自のプロパティ)を定義して、それをJSONに含めて返す方法をブログに書きたいと思います。
また下記のように、実行時に追加することも可能です。
https://laravel.com/docs/5.7/eloquent-serialization#appending-values-to-json
最後になりますが本ブログでは、PHP、フロントエンド、Python、サーバー、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!
今日はLaravelネタで、Eloquentで独自属性(独自のプロパティ)を定義して、それをJSONに含めて返す方法をブログに書きたいと思います。
目次
何がしたいのか
Eloquentで作成したモデルは、対応したデータベースのテーブルを表現しています。例えば、ユーザーの投稿を表現するposts
テーブルがあるとします。その中で投稿ファイルの名前を保持するフィールド(file_name
)がある場合に、クライアントへのレスポンスはファイル名ではなくてファイルにアクセス可能なURLで返したいという場面が多いです。// 取得できるものはfile_name file_name : '1.jpg' // しかし、クライアントへ返却したいのは、それにアクセスするためのURL file_url : 'https://xxx.s3.ap-northeast-1.amazonaws.com/1.jpg'これを実現するために、Eloquentの
Attribute
機能と$appends
機能が役立ちます。今日はそれを扱いたいと思います。Eloquentモデルに独自属性を追加する
独自属性を追加するには、getXXXXAttribute
メソッドを定義します。<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * file_url 属性を定義します. * ファイルURLを返却する. * * @return string - fileUrl */ public function getFileUrlAttribute() { $path = 'https://xxx.s3.ap-northeast-1.amazonaws.com/'; return $path1 . $this->file_name; } }ここでは
getFileUrlAttribute
という関数を定義しました。これを定義することで、file_url
というオリジナルの属性が利用できます。$post = App\Post::find(1); $post->file_url; // 例:https://xxx.s3.ap-northeast-1.amazonaws.com/これで独自の属性を定義し、利用することができました。
JSONレスポンスに独自属性を追加する
上記の実装だけでは、JSONレスポンス(toArray()
をした結果)に定義した属性が含まれません。含めるために$appends
を定義します。<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * モデルの配列形態に追加するアクセサ * * @var array */ protected $appends = ['file_url']; // ★★★ 追加 ★★★ /** * ファイルURLを返却する. * * @return string - fileUrl */ public function getFileUrlAttribute() { $path = 'https://xxx.s3.ap-northeast-1.amazonaws.com/'; return $path1 . $this->file_name; } }
$appends
を定義することで、独自フィールドであるfile_url
を、JSONレスポンスに含めたり、toArray()
した結果に含めたりすることができるようになります。また下記のように、実行時に追加することも可能です。
// file_url を追加する. $post->append('file_url')->toArray(); // モデルクラスの $appends の定義を今だけ上書きする. return $post->setAppends(['file_url'])->toArray();
参考資料
Attribute定義や$appends
に関する公式ドキュメントは下記です。https://laravel.com/docs/5.7/eloquent-serialization#appending-values-to-json
最後に
今回の例のように、ファイルパスを返すにはどうしたら良いのかな〜と調べていて、学びました。Laravel色々と学べることが多くて素敵ですね。最後になりますが本ブログでは、PHP、フロントエンド、Python、サーバー、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSやTwitterをフォローして貰えたら嬉しいです ^ ^
最後までご覧頂きましてありがとうございました!