2018/11/29更新

[Laravel] EloquentでAttributeと$appendsを使って、独自定義のフィールドを作る

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は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、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。