【问题标题】:Laravel converts integer to NULL when returning Model as JSON将模型返回为 JSON 时,Laravel 将整数转换为 NULL
【发布时间】:2021-10-07 20:56:13
【问题描述】:

这是我一生中见过的最奇怪的错误,我不知道如何解释,但它正在发生。

从控制器返回模型列表时:

public function index()
{
     return MyModel::orderBy('name')->get();
}

我在浏览器中收到以下反馈:

现在如果我切换到:

public function index()
{
     return MyModel::orderBy('name')->get()->toArray();
}

我在浏览器中得到以下反馈:

在尝试找到不需要调用toArray() 函数的解决方案后,我发现通过覆盖jsonSerialize() 方法,如下例所示,在MyModel 类中,它可以正确转换cost_id 转为数字。

public function jsonSerialize()
{
    return parent::jsonSerialize();
}

如果我将字段作为字符串放在$casts 中,它可以工作,但会将数字转换为字符串。

我的模特:

我的后台:

  • PHP 5.6.40
  • Laravel 5.4
  • 数据库是 DBMaker

【问题讨论】:

  • 您的案例是否有任何理由不设置默认值 0 而不是保留它 NULL 并导致不可预测的行为?
  • 如果有什么理由来NULL,我不知道。我很快就尝试手动转换此值。

标签: php laravel laravel-5 eloquent php-5.6


【解决方案1】:

cost id 不应该是可填充的,这是你的主键并且很可能设置为自动递增,它也不应该被强制转换,因为主键应该是一个自动递增的整数

但是您是否仍希望遵循此设计并让 cost_id 可填写

1 - 确保它是整数或字符串 2 - 如果您不需要,请不要这样做 3 - 可能,在您的控制器中尝试正常响应,例如 response()->json(MyModel::orderBy('name')->get());

我不保证上面的方法对你有用,因为它看起来很奇怪,你检查过你的数据库并确保这个特定记录的 cost_id 没问题吗?因为是整数而不是字符串?不为空吗?

告诉我进展如何

附注:

我建议使用作为主键和自动增量的普通 ID 字段

【讨论】:

  • 我不想创建记录,我只是想将所有记录作为 JSON 返回。关于数据库,看到所有其他记录正确地以整数形式出现,只有第一个 q 没有。但是,你是对的,我不小心把它放在了可填充的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多