laravel 5.6 批量插入 json 数据

laravel 5.6 bulk inserting json data

我正在尝试构建一个 API 来存储和检索 MCQ 试卷。我正在使用 laravel 资源 class 发送句柄 Json 数据。我需要在不使用多维数组的情况下在单个查询中将 40 条记录插入 MySQL 数据库。有什么方法吗?

来自前端的示例数据:

{
"data":[
    {
    "paper_id":"5",
    "question_no":"2",
    "question":"test insert code",
    "answer1":"answer1",
    "answer2":"answer2 ",
    "answer3":"answer3 ",
    "answer4":"Answer4 ",
    "answerC":"Correct Answer",
    "knowarea":"who knows!"

    },

    {
        "paper_id":"5",
        "question_no":"3",
        "question":"test insert code",
        "answer1":"answer1",
        "answer2":"answer2 ",
        "answer3":"answer3 ",
        "answer4":"Answer4 ",
        "answerC":"Correct Answer",
        "knowarea":"who knows!"

    },

    {
        "paper_id":"5",
        "question_no":"4",
        "question":"test insert code",
        "answer1":"answer1",
        "answer2":"answer2 ",
        "answer3":"answer3 ",
        "answer4":"Answer4 ",
        "answerC":"Correct Answer",
        "knowarea":"who knows!"

    },

    {
        "paper_id":"5",
        "question_no":"5",
        "question":"test insert code",
        "aanswer1":"answer1",
        "answer2":"answer2 ",
        "answer3":"answer3 ",
        "answer4":"Answer4 ",
        "answerC":"Correct Answer",
        "knowarea":"who knows!"

    }
]

}`

前端发送了 40 个这样的对象,我需要将它们批量插入到我的数据库中。 下面的代码是我的控制器存储功能,

`   $paper->paper_id = $request->input('paper_id');
    $paper->question_no = $request->input('question_no');
    $paper->question = $request->input('question');
    $paper->answer1 = $request->input('answer1');
    $paper->answer2 = $request->input('answer2');
    $paper->answer3 = $request->input('answer3');
    $paper->answer4 = $request->input('answer4');
    $paper->answerC = $request->input('answerC');
    $paper->knowarea = $request->input('knowarea');

    if($paper->save())
    {
        return new ExamPaperResource($paper);
    }

批量插入数据有哪些选择?

您可以使用:Eloquent::insert()

就像下面的例子。

$data = array(
    array('name'=>'Coder 1', 'rep'=>'4096'),
    array('name'=>'Coder 2', 'rep'=>'2048'),
    //...
);

Coder::insert($data);

根据您的示例数据,您可以 json_decode 数据,然后使用单个 Model::insert():

{
  "data":[
    {
      "paper_id":"5",
      "question_no":"2",
      "question":"test insert code",
      "answer1":"answer1",
      "answer2":"answer2 ",
      "answer3":"answer3 ",
      "answer4":"Answer4 ",
      "answerC":"Correct Answer",
      "knowarea":"who knows!"
    },
    ...
  ]
}

// Controller.php
public function store($json)
{
    $data = json_decode($json, true);
    Paper::insert($data);
}

这将从您的 json 创建数组,然后一次性插入所有记录。

尝试下面的代码

$jsonarray =json_decode(json_encode($b),TRUE); // $b=your json array
foreach ($jsonarray as $key => $value) 
{
 foreach ($value as $a => $b) 
  {
  $qry=DB::insert('insert into your_table(colomn_name1,colomn_name2)values(?,?)',[$b['indexname1'],$b['indexname2']]); //index name will be paper_id,question_no etc
  }
}

您的代码将如下所示

public function bulkdata(Request $request)
  {

   $b=$request->input('data');
$jsonarray =json_decode(json_encode($b),TRUE);
foreach ($jsonarray as $key => $value) 
{

 foreach ($value as $a => $b) 
  {

  $qry=DB::insert('insert into yourtable(paper_id,question_no,question,answer1,answer2,answer3,answer4,answerC,knowarea)values(?,?,?,?,?,?,?,?,?)',[$b['paper_id'],$b['question_no'],$b['question'],$b['answer1'],$b['answer2'],$b['answer3'],$b['answer4'],$b['answerC']$b['knowarea']);
  }
}         

}

这段代码对我有用。它插入了所有 40 条记录,没有任何问题。

$array = $request->all();
    foreach($array["data"] as $row)
    {
        Exam_Paper::create(['paper_id'      => $row["paper_id"],
                            'question_no'   => $row["question_no"],
                            'question'      => $row["question"],
                            'answer1'       => $row["answer1"],
                            'answer2'       => $row["answer2"],
                            'answer3'       => $row["answer3"],
                            'answer4'       => $row["answer4"],
                            'answerC'       => $row["answerC"],
                            'knowarea'      => $row["knowarea"],
        ]);

    }

使用更新模型数组字段插入 select 查询

$newModelsArray=ModelTable::where(....)->get();


            foreach ($newModelsArray as $objectItr) {

            $newObjectItr = $objectItr->replicate();
            $newObjectItr->field=newValue;
            $newObjectItr->save();
            }

然后您将更新并保存到 table(将其克隆回数据库) ->replicate() 将克隆模型对象,而 ->save() 会将其添加到循环内的数据库中!

谢谢 阿里

使用 collect 函数和 toJson() 将输出作为 JSON 可以轻松解析的对象。

collect([ 'x' => 3 ])->toJson();