信息发布→ 登录 注册 退出

Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程

发布时间:2025-12-18

点击量:
Laravel自5.2起支持Eloquent模型操作JSON字段,需在迁移中使用$json()定义字段,在模型中通过$casts将字段转为array类型,即可像数组一样读写嵌套值,如$user->settings['theme'];支持where('settings->theme', 'dark')等语法查询,还可使用whereJsonContains、whereJsonLength进行高级查询;配合update方法可直接更新JSON子键;通过Accessor和Mutator可自定义格式化与保存逻辑,实现灵活的数据处理。

Laravel 自 5.2 版本起就支持在 Eloquent 模型中直接操作数据库的 JSON 字段,尤其是配合 MySQL 5.7+ 或 PostgreSQL 这类支持原生 JSON 的数据库时,使用体验非常流畅。通过简单的语法,你可以像访问对象属性一样读写 JSON 中的子字段。下面带你一步步掌握 Laravel 中 Eloquent 对 JSON 字段的操作方法。

1. 数据库迁移中定义 JSON 字段

在创建或修改数据表时,使用 $table->json() 方法来定义一个 JSON 类型的字段:

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->json('settings'); // 定义 JSON 字段
    $table->timestamps();
});

你也可以使用 nullable()->json() 允许该字段为空。

2. 在模型中自动序列化与反序列化

Laravel 会自动将 JSON 字段从数据库中取出时反序列化为 PHP 数组,并在保存时重新序列化。你需要在 Eloquent 模型中将该字段添加到 $casts 属性中:

class User extends Model
{
    protected $casts = [
        'settings' => 'array', // 将 settings 字段自动转为数组
    ];
}

使用 'array' 类型 cast 是处理 JSON 字段最常见的方式。Laravel 内部会将其作为 JSON 存储和读取。

3. 读写 JSON 字段中的值

一旦设置了 $casts,你就可以像操作普通数组一样访问嵌套值:

$user = User::find(1);

// 获取 JSON 中的某个值
$theme = $user->settings['theme'] ?? 'light';

// 设置值
$user->settings['theme'] = 'dark';
$user->settings['notifications'] = ['email' => true, 'sms' => false];

// 保存
$user->save();

也支持使用 update() 方法直接更新部分 JSON 字段(适用于 MySQL):

User::where('id', 1)->update([
    'settings->theme' => 'dark',
    'settings->language' => 'zh-CN'
]);

注意:这种方式只更新 JSON 中的特定键,不会影响其他设置。

4. 查询 JSON 字段内容

Laravel 支持使用箭头语法在查询中访问 JSON 字段:

  • User::where('settings->theme', 'dark')->get();
  • User::whereJsonContains('settings->notifications', ['email' => true])->get();
  • User::whereJsonLength('settings->notifications', 2)->get();

whereJsonContains 适用于检查 JSON 数组或对象是否包含指定内容,whereJsonLength 可用于判断数组长度。

5. 使用 Mutator 和 Accessor 精细控制

如果需要更复杂的逻辑,可以定义访问器(Accessor)和修改器(Mutator):

// 访问器:获取格式化后的设置
public function getFormattedSettingsAttribute()
{
    return collect($this->settings)->mapWithKeys(function ($value, $key) {
        return [ucfirst($key) => $value];
    });
}

// 修改器:在保存前统一处理
public function setSettingsAttribute($value)
{
    $this->attributes['settings'] = json_encode(array_merge(
        $this->settings ?? [], 
        $value
    ));
}

这样可以在业务逻辑中灵活扩展 JSON 字段的行为。

基本上就这些。Laravel 的 Eloquent 对 JSON 字段的支持已经非常完善,合理使用 $casts 和数据库原生功能,能让你轻松管理结构化配置、用户偏好等数据。关键是记得在 $casts 中声明类型,并了解不同数据库对 JSON 的支持差异。不复杂但容易忽略细节。

标签:# table  # 将其  # 并在  # 你也  # 尤其是  # 你可以  # 让你  # 序列化  # 化与  # 适用于  # 数据库  # postgresql  # mysql  # 对象  # 访问器  # Nullable  # Array  # 修改器  # ai  # access  # json  # js  # laravel  # php  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!