返回

如何在 Laravel 中更新带有圆点键的 JSON 列?

php

用 Eloquent 更新带有圆点键的 JSON 列

简介

在数据库编程中,我们经常会遇到需要处理 JSON 数据的情况。对于带有圆点键的 JSON 数据,使用 Eloquent 更新它们可能会遇到一些挑战。本文将探讨这些挑战并提供一种解决方案,以便使用 Eloquent 方便地更新此类数据。

问题

在 Laravel Eloquent 中,通过 isFillable 方法来检查某个属性是否可以被填充。对于带有圆点键的 JSON 数据,默认情况下,这些属性被视为不可填充。

Illuminate\Database\Eloquent\Concerns\GuardsAttributes::isFillable

这意味着,当我们尝试使用 update 方法来更新带有圆点键的 JSON 数据时,会遇到以下错误:

Attempting to mass assign protected property.

解决方法

为了解决这个问题,我们需要覆盖 isFillable 方法,让它返回 true,表明所有属性都可被填充。

class Something extends Model
{
    protected function isFillable($key)
    {
        return true;
    }
}

通过这种方法,我们可以让 Eloquent 认为所有属性都可被填充,包括带有圆点键的 JSON 数据。

代码示例

现在,我们可以使用 Eloquent 轻松地更新带有圆点键的 JSON 数据了。

Something::find(1005)->update(['state->2.95'=>8.7]);

注意点

需要注意的是,覆盖 isFillable 方法会使所有属性都可被填充,包括那些你可能不希望被更新的属性。因此,在使用此方法时,请确保谨慎。

常见问题解答

1. 为什么默认情况下,带有圆点键的 JSON 数据属性不可填充?

为了防止恶意用户更新模型中受保护的属性,Laravel 默认情况下将带有圆点键的属性视为不可填充。

2. 是否有其他方法可以更新带有圆点键的 JSON 数据?

除了覆盖 isFillable 方法外,还可以使用原始 SQL 查询或直接修改数据库表来更新带有圆点键的 JSON 数据。

3. 如何确保在使用此方法时不会更新受保护的属性?

可以使用白名单机制,只允许更新某些特定的属性。

4. 是否可以更新嵌套的 JSON 数据?

是的,可以使用 Eloquent 的 array_dot 助手方法将嵌套的 JSON 数据转换为扁平数组,然后使用 update 方法更新。

5. 是否有替代 Eloquent 的方法来处理带有圆点键的 JSON 数据?

有,可以使用其他 ORM 框架,如 Doctrine ORM 或 Propel ORM,它们支持更新带有圆点键的 JSON 数据。

结论

通过覆盖 isFillable 方法,我们可以使用 Eloquent 方便地更新带有圆点键的 JSON 数据。但是,需要注意使用此方法时的潜在风险,并根据需要采取适当的预防措施。