Laravel中如何仅将API响应JSON里的message内容插入数据库?
Laravel中如何仅将API响应JSON里的message内容插入数据库?
Hey,我来帮你搞定这个需求!首先得捋清楚你拿到的OpenAI API返回的数据结构——从你贴的代码来看,你要的message其实藏在$data['choices'][0]['message']里,不是直接的$data['message'],这点得先纠正哈。接下来咱们一步步实现把这个内容存入Laravel数据库:
第一步:准备数据库表和模型
首先得有对应的表来存数据,咱们以创建一个chat_responses表为例:
- 生成迁移文件:
php artisan make:migration create_chat_responses_table
- 打开生成的迁移文件,定义字段。如果你想存整个
message对象(包含role和content),可以用json类型;如果只想存纯文本内容,就用text类型:
public function up() { Schema::create('chat_responses', function (Blueprint $table) { $table->id(); // 方案1:存整个message对象 $table->json('message'); // 方案2:单独存内容(更常用) // $table->string('role')->default('assistant'); // $table->text('content'); $table->timestamps(); }); }
- 运行迁移创建表:
php artisan migrate
- 生成对应的模型:
php artisan make:model ChatResponse
- 打开模型文件,设置可填充字段和类型转换(如果用json字段的话):
class ChatResponse extends Model { use HasFactory; // 根据你的方案设置可填充字段 protected $fillable = ['message']; // 或者方案2的:protected $fillable = ['role', 'content']; // 如果用json字段,需要把它转成数组 protected $casts = [ 'message' => 'array', ]; }
第二步:修改API请求代码,插入数据库
现在调整你原有的代码,把拿到的message数据存入数据库:
// 别忘了引入模型 use App\Models\ChatResponse; $data = Http::withHeaders([ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer '.env('OPENAI_API_KEY'), ]) ->post("https://api.openai.com/v1/chat/completions", [ "model" => "gpt-3.5-turbo", 'messages' => [ [ "role" => "user", "content" => $search ] ], 'temperature' => 0.5, "max_tokens" => 200, "top_p" => 1.0, "frequency_penalty" => 0.52, "presence_penalty" => 0.5, "stop" => ["11."], ]) ->json(); // 先判断API是否返回了正确的数据,避免报错 if (!isset($data['choices'][0]['message'])) { return response()->json(['error' => 'API请求失败或返回格式异常'], 500); } // 拿到要存入的message数据 $message = $data['choices'][0]['message']; // 插入数据库(根据你的方案选一种) // 方案1:存整个message对象 ChatResponse::create(['message' => $message]); // 方案2:单独存content和role // ChatResponse::create([ // 'role' => $message['role'], // 'content' => $message['content'] // ]); return response()->json($message, 200, array(), JSON_PRETTY_PRINT);
小提示
- 如果是生产环境,建议给API请求加个超时设置,避免长时间等待;
- 可以考虑把API请求的逻辑抽成单独的服务类,让代码更整洁、易维护。
备注:内容来源于stack exchange,提问作者Farshid Mahmoudi
相关产品推荐
相关产品推荐

