You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何仅将API响应JSON里的message内容插入数据库?

Laravel中如何仅将API响应JSON里的message内容插入数据库?

Hey,我来帮你搞定这个需求!首先得捋清楚你拿到的OpenAI API返回的数据结构——从你贴的代码来看,你要的message其实藏在$data['choices'][0]['message']里,不是直接的$data['message'],这点得先纠正哈。接下来咱们一步步实现把这个内容存入Laravel数据库:

第一步:准备数据库表和模型

首先得有对应的表来存数据,咱们以创建一个chat_responses表为例:

  1. 生成迁移文件:
php artisan make:migration create_chat_responses_table
  1. 打开生成的迁移文件,定义字段。如果你想存整个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();
    });
}
  1. 运行迁移创建表:
php artisan migrate
  1. 生成对应的模型:
php artisan make:model ChatResponse
  1. 打开模型文件,设置可填充字段和类型转换(如果用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:28:13