Laravel MySQLで取得した数値が文字列型になってしまうとき
以下のようにMySQLで取得した値をJSONでレスポンスするとき、データベースでは数値型で定義していた項目が文字列型になってしまう場合があります。
$user = User::find($id);
return response()->json(['user' => $user], 200);{
"name": "foo",
// "age": 20 // 数値で出力したい
"age": "20" // 文字列になってしまう
}対処法
CAST
Modelにcastsの設定をしておくと、その型に変換してくれます。
class User extends Model
{
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'age' => 'integer',
];
}JSON_NUMERIC_CHECK
以下のようにJSON_NUMERIC_CHECKを使用する方法をよく見かけますが、これでは文字列型のカラムでも値が数値の場合は数値型になってしまうので注意が必要です。
$user = User::find($id);
return response()->json(['user' => $user], 200, [], JSON_NUMERIC_CHECK);{
// "name": "123", // 文字列で出力したい
"name": 123, // 数値に変換可能な場合は数値型になってしまう
"age": 20
}