Eloquentでレコードを取得するとき、任意の値を結果に追加したいときの方法を紹介します。
アクセサとは?
Laravelにはアクセサ(Accessors)という機能があります。
アクセサとは、返り値に任意の値を追加してくれる機能のことです。モデルに定義しておくことで、データを自動的に加工した値や、任意の値を取得されるデータに追加してくれます。
アクセサを使ってみよう!
実際にアクセサを使ってみましょう。ここでは例としてブログサイトを考えてみます。
記事のモデル「Post」で投稿を取得した際に、データベースに格納されているすべての記事の数を同時に取得できるようにしてみたいと思います。
モデル(app\Models\Post)にアクセサを定義します。
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $appends = ['count'];
public function getCountAttribute()
{
return Post::count();
}
}
アクセサの関数はget+属性名+Attributeという名前で定義するようにします。命名規則に従うことで、自動的にアクセサが認識されます。
また、$appendsに追加する属性の名前を追加することで、データ取得時に自動的に実行されるようにします。
アクセサを定義したら、モデルからデータを取得してみましょう。
dd(Post::find(1))
=>{id:"1",title:"sample",body:"asdf",count:"5"}
通常はデータベースにあるデータしか取得されませんが、アクセサが動作したことでcountという属性が追加され、データと一緒に記事数が返されていることがわかります。
データベースから取得した値を加工してみよう!
アクセサでは取得したレコードの値を参照することもできます。
$this->attributes["カラム名"]
で取得したレコードのデータを参照することができます。
例えば、記事本文(body)の文字数を一緒に返したいなら、こんな感じのアクセサを定義すればOKです。
//本文の文字数を一緒に返す
public function getLengthAttribute()
{
return strlen($this->attributes["body"])
}
$appendsにlengthを追加すれば、レコードを取得したときに本文(body)の文字数を一緒に返してくれるようになります。
商品金額から税込価格を取得したり、空白区切りの氏名から姓と名を取得したり、さまざまな活用法が考えられますね。
コメント