簡體   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