【Laravel】attributeメソッドについて(アクセサ / ミューテタ)
eloquentの機能。
https://readouble.com/laravel/6.x/ja/eloquent.html
Attribute
アクセサ、ミューテタという機能で呼ばれる。
Attributeはあくまで機能に使用するメソッドに使われる単語というだけ。
https://readouble.com/laravel/5.6/ja/eloquent-mutators.html
アクセサ
ModelにgetFooAttributeというような形のメソッドを定義する。
$model->fooとした場合、eloquentが自動的にこのアクセサメソッドを呼び出すようになる。
アッパーケースで書くこと。
$model->long_columnという形で出したいなら
public function getLongColumnAttribute()として定義する
code:Post.php
public function getIsSetKaidddReactionAttribute() {
$reactions = array_unique(explode(',', $this->reaction));
$kaiddd_reactions = 5, 7;
foreach ($kaiddd_reactions as $k_r) {
if (in_array( $k_r, $reactions)) {
return true;
} else {
continue;
}
}
return false;
}
code:StudyController.php
public function studyAccessor() {
$recently_posts = Post::Recently()->get();
$kaiddd_count = 0;
foreach ($recently_posts as $p) {
if ($p->is_set_kaiddd_reaction) { // Modelで定義したアクセサの呼び出し
$kaiddd_count++;
}
}
return '直近1ヶ月の投稿でかいデデデさんのリアクションがついた投稿の件数は' . $kaiddd_count . '件です。';
}
Attribute()とAttribute($value)の使い分け
既に同じカラムが存在するときは、$valueを定義する
$valueにそのカラムの情報が引数として渡される。
例えば$post->english_messageという既に存在するカラムにアクセサを定義したい場合。
code:php
// $valueは、$model->english_messageという、カラムの情報のことを指す
public function getEnglishMessageAttribute($value)
{
return ucfirst($value); // 常に最初の一文字を大文字にして返す
}
ミューテタ
データベースに情報を保存する時に走らせる処理のことを指す。
アクセサはデータベースから参照する時に走る処理のことなので、対照的
setFooAttributeというように、getではなくsetという形でattributeメソッドを定義する。
code:Post.php
// $post->save()した時、処理が走る。小文字が全部大文字になるというミューテタ
public function setMessageAttribute($value) {
$this->attributes'message' = strtoupper($value);
}
code:StudyController.php
public function studyMutator() {
$post = Post::find(1572);
$post->message = 'aaa kakikomi';
$post->save(); // // setMessageAttribute()が呼ばれ, AAA KAKIKOMI として保存.
...
}