Laravel 11 如何在数据库中存储 JSON 格式数据
在本篇文章中,将展示如何在 Laravel 11 中把 JSON 格式数据存入数据库中。
Laravel 模型中的 $casts
属性可以指定将模型中的一些属性进行数据转换。当使用 $cats
属性时,Laravel 会自动在常见的数据类型(如 String、Int、Boolean、JSON) 之间进行转换。
在本篇文章中,将创建一个包含有 name
和 details
字段的数据表 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)
请登录后再评论