zukucode
主にWEB関連の情報を技術メモとして発信しています。

Laravel MySQLで取得した数値が文字列型になってしまうとき

以下のようにMySQLで取得した値をJSONでレスポンスするとき、データベースでは数値型で定義していた項目が文字列型になってしまう場合があります。

$user = User::find($id);
return response()->json(['user' => $user], 200);
{
  "name": "foo",
  // "age": 20 // 数値で出力したい
  "age": "20" // 文字列になってしまう
}

対処法

CAST

Modelcastsの設定をしておくと、その型に変換してくれます。

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
}

関連記事