简体   繁体   中英

Laravel - save json to database column vs Call to a member function save() on array

I am getting data in Laravel API and I want to add it to the JSON inside one of the columns in my table. But I am getting an error. Can you help me to save my JSON into the database column, please?

In my users table, I have a column called answer_history with this JSON

[
  [
    {
      "quizID": 1,
      "questionID": 1,
      "selectedAnswer": "Green",
      "correctAnswer": false
    },
    {
      "quizID": 1,
      "questionID": 2,
      "selectedAnswer": "Skin",
      "correctAnswer": false
    },
    {
      "quizID": 1,
      "questionID": 3,
      "selectedAnswer": "Pup",
      "correctAnswer": true
    }
  ]
]

This is my code to update the column

/**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\User  $user
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $answers = User::find($id)->answer_history;
        $newAnswers = $request->answerHistory;
        $answers[] = $newAnswers;
        $answers->save();
        return $answers;
    }

I receive this json

  [
    {
      "quizID": 1,
      "questionID": 1,
      "selectedAnswer": "White",
      "correctAnswer": false
    },
    {
      "quizID": 1,
      "questionID": 2,
      "selectedAnswer": "Keratin",
      "correctAnswer": true
    },
    {
      "quizID": 1,
      "questionID": 3,
      "selectedAnswer": "Cub",
      "correctAnswer": false
    }
  ]

If I comment $answer->save(), the response in my browser-.network->response is

[
  [
    {
      "quizID": 1,
      "questionID": 1,
      "selectedAnswer": "Green",
      "correctAnswer": false
    },
    {
      "quizID": 1,
      "questionID": 2,
      "selectedAnswer": "Skin",
      "correctAnswer": false
    },
    {
      "quizID": 1,
      "questionID": 3,
      "selectedAnswer": "Pup",
      "correctAnswer": true
    }
  ],
  [
    {
      "quizID": 1,
      "questionID": 1,
      "selectedAnswer": "White",
      "correctAnswer": false
    },
    {
      "quizID": 1,
      "questionID": 2,
      "selectedAnswer": "Keratin",
      "correctAnswer": true
    },
    {
      "quizID": 1,
      "questionID": 3,
      "selectedAnswer": "Cub",
      "correctAnswer": false
    }
  ]
]

If not, I get this error

"Call to a member function save() on array"

I added cast in my model

    protected $casts = [
        'email_verified_at' => 'datetime',
        'answer_history' => 'array'
    ];

It's because the variable $answers is a value of your model. You need to keep it as your model

Try this

public function update(Request $request, $id)
    {
        $answers = User::find($id);
        $newAnswers = $request->answerHistory;
        $answers->answer_history[] = $newAnswers;
        $answers->save();
        return $answers;
    }

Function save() is from the User model and not the value...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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