Laravelのアクセサとミューテータについてのメモ
アクセサとは
アクセサを利用すると独自のプロパティを取り出したり、既存のプロパティを上書きして取り出すことができます。
アクセサはModelに以下のような形で定義すると実装することができます。 プロパティ名はキャメルケース(camelCase)で定義します。
public function get{プロパティ名}Attribute() { ... return 値; }
view側ではプロパティ名をスネークケース(snake_case)で定義することで値を受け取ることができます。
実装例
以下のようなテーブルがあるとします。
テーブル名:users
id | name | age |
---|---|---|
1 | 佐藤 | 40 |
2 | 加藤 | 30 |
3 | 斎藤 | 20 |
◎app/User.php
モデルは以下のような感じです。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Person extends Model { public function getNameAndIdAttribute() { return '私は' . $this->name .'です。年齢は' . $this->age . 'です。' ; } }
@app/Http/Controllers/HelloController.php
class HogeController extends Controller
{
public function index(Request $request)
{
$result = User::get();
$data = [
'data' => $result
];
return view('hoge.index', $data);
}
}
@/resources/views/hoge/index.blade.php
@foreach($data as $item) <li> // プロパティ名のスネークケースを定義する {{$item->name_and_id}} </li> @endforeach
表示は以下になります。
・私は佐藤です。年齢は40です。 ・私は加藤です。年齢は30です。 ・私は斎藤です。年齢は20です。
ミューテータ
ミューテータはプロパティの値の設定する処理を上書きすることができます。
アクセサはModelに以下のような形で定義すると実装することができます。 プロパティ名はキャメルケース(camelCase)で定義します。
public function set{プロパティ名}Attribute() { ... }
実装例
◎app/User.php
モデルは以下のような感じです。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Person extends Model { public function setAgeAttribute($value) { $this->attributes['name'] = $value + 10; } }
@app/Http/Controllers/HelloController.php
class HogeController extends Controller { public function update($id,$age) { $record = Person::find($id); $record->age = $age; $record->save(); return redirect('/hoge'); } }
routes/web.php
Route::get('/hoge/{id}/{age}', 'HelloController@update');
hoge/1/10
でアクセスした場合の表示は以下になります。
・私は佐藤です。年齢は20です。 // setAgeAttributeが実行される