JSONへのシリアル化時に属性名で番号を持つアクセサーを走らない


私は最近、LALAVELがJSONに私の雄弁なモデルを直列化するとき、アクセサーを実行していなかった問題に出くわしました.私には1つの財産があったis_drop_off_location そしてis_24_hour_drop_off_location . これらの値は、BooleansをサポートしていないSQLiteデータベースに格納されており、JSONにモデルをシリアル化するときに"0" or "1" を文字列で返します.
私はモデルにこれらの文字列を適切なブール値に変換するために以下のアクセサを追加しました.
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Location extends Model
{
    public function getIsDropOffLocationAttribute($value)
    {
        return $value == "1" ? true : false;
    }

    public function getIs24HourDropOffLocationAttribute($value)
    {
        return $value == "1" ? true : false;
    }
}
しかし、JSONにシリアル化すると、次のようになります.
{
  "is_drop_off_location": true,
  "is_24_hour_drop_off_location": "0"
}
見回すと、私はただ一人しかいなかったproblems with numbers and serialization .
私が言うことができる限り、このバグはStudlyCase 属性名snake_case , そして、変換機能は、数の前にアンダースコアがあるということを知る方法がありません.
良いニュースは、解決可能な問題です.Laravel allows you to explicitly append values to JSONprotected $appends Elququentモデルの性質この機能は、データベース列に対応しない動的な属性を追加するために存在しますが、Laravelは、その中の番号を持つ属性のアクセサをシリアル化することを保証するために使用できます.
以下のモデルは次のようになります.
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Location extends Model
{
    // This will make Laravel serialize our accessor.
    protected $appends = ['is_24_hour_drop_off_location'];

    public function getIsDropOffLocationAttribute($value)
    {
        return $value == "1" ? true : false;
    }

    public function getIs24HourDropOffLocationAttribute($value)
    {
        return $value == "1" ? true : false;
    }
}
私がこれをJSONに連載するとき、ラーラーベルはアクセサーを見るのを知っています.
上記のコードから出力されたJSONシリアル出力です.
{
  "is_drop_off_location": true,
  "is_24_hour_drop_off_location": false
}
ハッピーコーディング.