繁体   English   中英

使用 Laravel 和 Inertia 访问 json 数据

[英]Access json data with Laravel and Inertia

我有一个带有 1 个输入字段和一个提交按钮的简单表单。

所做的只是获取用户输入,将其与外部 API 匹配,然后将这两个记录提交到数据库。

来自外部 API 的响应是 JSON 格式,像这样但我只想检索choices下的text字段

{
  "id": "123",
  "object": "tc",
  "created": 1655642237,
  "model": "text-code",
  "choices": [
    {
      "text": "paragraph text here",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ]
}

这存储在变量$complete中,因此当我在视图中访问它时,我无法仅针对特定元素获得所有这些。

这是我的 controller

public function index()
    {
        $prompts = Writer::all();

        return Inertia::render('Writer', [
            'prompts' => $prompts
        ]);
}

public function store(Request $request)
    {
        $complete = $start->complete([
             'engine' => '002',
             'prompt' => $request->input('inputText')
        ]);

        $data = json_decode($complete, true);

        Validator::make($request->all(), [
            'inputText' => 'required|min:5|max:255|string',
        ])->validate();

        Writer::create([
            'request' => $request->input('inputText'),
            'response' => $data['choices']
        ]);

        return redirect()->back()->with('message', 'success.');

}

我必须将$complete传递给create()方法,因为传递$data会出错

数组到字符串的转换

class stdClass 的 Object 无法转换为字符串

但是,如果我在变量之后return $data['choices'] ,我会得到仅在choices下的字段

视图非常简单

<div class="card w-100 bg-light mt-4 mb-4" v-for="prompt in $page.props.prompts">
    <div class="card-body">
        <h5 class="card-title">{{ prompt.request }}</h5>
        <p class="card-text">{{ prompt.response }}</p>
    </div>
</div>

为了访问$choices -array 中的数据(它是一个数组,而不是一个字符串,这就是相应地出现错误的原因),将store -method 中的相应行更改为

Writer::create([
    'request' => $request->input('inputText'),
    'response' => $data['choices'][0]['text']
]);

但请注意$data[ 'choices' ]可能为空,因此在存储任何值之前,请确保检查是否存在并提供默认值,例如

$text = $data['choices'][0]['text'] ?? 'my-default-value';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM