Laravel 11 如何在数据库中存储 JSON 格式数据

作者: 温新

图书: 【Laravel 11 实战】

阅读: 44

时间: 2024-11-21 17:53:52

在本篇文章中,将展示如何在 Laravel 11 中把 JSON 格式数据存入数据库中。

Laravel 模型中的 $casts 属性可以指定将模型中的一些属性进行数据转换。当使用 $cats 属性时,Laravel 会自动在常见的数据类型(如 String、Int、Boolean、JSON) 之间进行转换。

在本篇文章中,将创建一个包含有 namedetails 字段的数据表 products,且 details 列将使用 JSON 数据类型。然后在 Product 模型中将 details 设置为强制转换为 json

创建项目

此处,无论是使用 bootstrap 还是 breeze 都可以,根据自己喜好来定。

$ composer global require laravel/installer
$ laravel new reverb-chat

创建迁移

1)生成迁移文件

php artisan make:migration create_products_table

2)添加字段

位置:database/migrations/2024_09_20_155614_create_products_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{

    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string("name");
            $table->json("details")->nullable();
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};

3)执行迁移文件

$ php artisan migrate

创建模型

1)生成模型和控制器

$ php artisan make:model Product -c

2)更新模型

位置:app/Models/Product.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;

    // 定义可批量赋值的字段
    protected $fillable = [
        'name', 'details'
    ];

    // 定义字段类型的转换
    protected $casts = [
        // 将 'details' 字段转换为 JSON 格式
        'details' => 'json'
    ];
}

添加路由

位置:routes/web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('products/create', [\App\Http\Controllers\ProductController::class, 'create']);

添加控制器方法

位置:app/Http/Controllers/ProductController.php

<?php

namespace App\Http\Controllers;

use App\Models\Product;

class ProductController extends Controller
{
    public function create(): Product
    {
        $data = [
            'name' => '小米 14',
            'details' => [
                'brand' => '小米',
                'tags'  => ['256 GB', '16 GB 内存']
            ]
        ];

        return Product::create($data);
    }
}

启动服务并测试

# 启动服务
$ php artisan serve

# 测试
$ curl http://127.0.0.1:8000/products/create
// 20240921000937
// http://127.0.0.1:8000/products/create
{
  "name": "小米 14",
  "details": {
    "brand": "小米",
    "tags": [
      "256 GB",
      "16 GB 内存"
    ]
  },
  "updated_at": "2024-09-20T16:09:36.000000Z",
  "created_at": "2024-09-20T16:09:36.000000Z",
  "id": 1
}

数据库查看一下数据:

mysql> select details from products;
+---------------------------------------------------------+
| details                                                 |
+---------------------------------------------------------+
| {"tags": ["256 GB", "16 GB 内存"], "brand": "小米"}     |
+---------------------------------------------------------+
1 row in set (0.00 sec)
请登录后再评论