laravel8でアクセッサが動作しないと思ったら、カラム名がcamelCaseだとアクセッサが効かない!
参考URL
https://qiita.com/naniwadari/items/07bd0329006ac06c94fe
明らかにコールされていない!
|
1 2 3 4 5 |
public function getRailroadNameAttribute($value) { return 'hello,world!!'; return $this->resolveTranslated('railroadName', $value); } |
Modelにpublic static $snakeAttributes = false;を追加したら
camelCaseでも、アクセッサが動作した。
|
1 2 3 4 |
class Railroad extends Model { // laravelは属性(変数名、テーブル名、カラム名)snake_case前提なので、キャメルケースだと動作が怪しいのでOFFにする public static $snakeAttributes = false; |
内部的にはgetArrayableAttributes() → toArray() の流れで
Str::snake($attributeName)
「モデルの属性名」と「アクセサのメソッド名」を照合しています。
これは気づかない・・・。 eloquent(ORマッパー)とか便利だけどブラックボックスだからな~。
実はこの $snakeAttributes の存在、
Laravel のドキュメントにはほとんど書かれていません。
だから 「なんで toArray() だと呼ばれない?」と悩む人が多い んです。
(GitHub issue にも同様の質問が結構あります)