結論
Model に toArray() メソッドを実装し、その中でよしなに設定すると良い。
例と方法
前提:
- User Model には first_name, last_name フィールドが存在している。
-
$user->full_name
とすると、$user->first_name . ' ' . $user->last_name
が表示される様に getAttribute を用いて設定している。
<?php
class User extends Model {
protected $fillable = [
'first_name',
'last_name',
];
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
上記の Model の状態だと、以下のように $user->full_name
が使える
User::create([
'first_name' => 'さんぷる',
'last_name' => 'いちごう',
]);
$user = User::find(1);
echo $user->full_name; // 「さんぷる いちごう」となる
getFullNameAttribute メソッドは echo など、文字列化の必要に迫られた際に toString マジックメソッド経由で呼び出される。
getFullNameAttribute にアクセスできない例:
どこからも文字列化されない(toStringからアクセスされない)場合は、 $user->full_name
が使えない。
例えば、 Json で値を返却する時など。
以下の様なケース。
$user = User::find(1);
return response()->json(['user' => $user]);
このとき、上記の response を受け取った javascript などでは、response.user.full_name
が存在しない。(toString 通ってないから。)
※response.user.first_name
と response.user.last_name
だけが存在する状態。
Json 化した際なども response.user.full_name
でアクセスさせる方法:
結論から書くと、 Model に toArray メソッドを実装することで実現できる
<?php
class User extends Model {
protected $fillable = [
'first_name',
'last_name',
];
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
/**
* このメソッドを追加
*/
public function toArray()
{
return array_merge(
parent::toArray(),
['full_name' => $this->full_name]
);
}
}
response()->json('user' => $user);
の中で、 $user->toArray()
が呼ばれて配列化される。
User Model に toArray を実装していない場合は、 Illuminate\Database\Eloquent\Model
の toArray メソッドが呼ばれる
このため、 User Model の toArray メソッドで適切に処理をすることで、 json 化した後でも full_name
にアクセス可能となる。
おしまい。