如何使用 Laravel 框架更新 MySQL 中的 json 数据?
Posted
技术标签:
【中文标题】如何使用 Laravel 框架更新 MySQL 中的 json 数据?【英文标题】:How can I update json data in MySQL with Laravel framework? 【发布时间】:2020-06-13 12:12:46 【问题描述】:我想用 Laravel 创建一个票务系统。我将聊天数据存储在 json 数据类型中。当用户想要发送她/他的票时,我会获取她/他的数据并使用以下代码存储它:
$messages = array([
'message_title' => post('message_title'),
'message_body' => post('message_body'),
'type' => 'q',
'created_at' => date('Y/m/d H:i:s'),
]);
$messagesToJson = json_encode($messages);
$query = DB::table('test')->insert([
'level_id' => post('message_level'),
'status' => 0,
'ticket_id' => post('user_id') . time(),
'user_id' => post('user_id'),
'backend_user_id' => '',
'messages' => $messagesToJson,
]);
这些数据存储在 mysql 中:
[
"message_title":"This is title","message_body":"Some text ... .","type":"q","created_at":"2020\/02\/29 20:42:26"
]
但我的问题是:当用户想在这张票中提出一个新问题时,我如何在这个数组中插入一个新对象,如下所示:
[
"message_title":"This is title","message_body":"Some text ... .","type":"q","created_at":"2020\/02\/29 20:42:26",
"message_title":"Question 2","message_body":"Some text in question 2 ... .","type":"q","created_at":"2020\/02\/29 21:42:26"
]
我的更新代码是:
$messages = array(
'message_body' => post('sendText'),
'type' => 'q',
'created_at' => date('Y/m/d H:i:s'),
);
$messagesToJson = json_encode($messages);
$updateQuery = DB::update("UPDATE synon_subsystem_ticketing
SET messages = JSON_SET(messages, '$[$countMessages]', '$messagesToJson') WHERE id = '$id'");
【问题讨论】:
请发布您当前的更新功能。 在我的问题中添加更新代码。 【参考方案1】:你有两个选择:
获取当前值,附加您的消息并更新:
$tiket = DB::table('synon_subsystem_ticketing')->find($id);
$messages = json_decode($ticket->messages) ?? []; //json_decode is not necessary if you're using attribute casting on your model
$messages[] = array(
'message_body' => post('sendText'),
'type' => 'q',
'created_at' => date('Y/m/d H:i:s'),
);
$messages = json_encode($messages); //json_encode is not necessary if you're using attribute casting on your model
DB::table('synon_subsystem_ticketing')
->where('id', $id)
->update(['messages' => $messages]);
注意:请查看 json column on migrations 和 updating json column 上的 Laravel 文档
对原始查询使用 MySql JSON_ARRAY_APPEND
函数。
【讨论】:
亲爱的 Hafez,我使用了 1 方式,但出现此错误:[] 运算符不支持字符串,此错误指向 $messages[] = ... @FarzinBidokhti 看来你需要json_decode
你的消息,查看我更新的答案。【参考方案2】:
MySQL 支持 json 列。您可以在 laravel 中创建和更新 json 列,如下所示。
$table->json('tickets_user_info'); // in your migration create json column.
//Update it as shown below.
$affected = DB::table('users')
->where('id', 1)
->update(['tickets_user_info' => 'what_ever_you_want_to_save_here']);
您可以创建包含旧数据的新数组,并使用所有数据更新您的 json 列。
也阅读 laravel 的 Query Json Columns 和 Updating JSON Columns
【讨论】:
以上是关于如何使用 Laravel 框架更新 MySQL 中的 json 数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 laravel 或仅使用本机 php 更新来自 mysql 数据库的 JSON 数据?