Laravel Eloquent Save не сохраняет - PullRequest
       3

Laravel Eloquent Save не сохраняет

1 голос
/ 08 октября 2019

Я пытаюсь сохранить ответы на опрос в моей БД, потому что по какой-то мне неизвестной причине не работает метод -> save (), однако работает -> update ().

Я продолжаю получатьошибка преобразования массива в строку каждый раз, когда я пытаюсь сохранить.

Я использовал dd / return / var_dump / print_r, что бы ни работало, чтобы показать, что он работал до этого шага. Теперь я знаю, что он работает до метода -> save ().

Мой контроллер:

$array = json_decode($request->getContent(), true);

        foreach ($array as $survey) {
            $objAns = new Survey_Answer();
            $objAns->name = $survey['surveyName'];
            $objAns->answers = $survey['answersPerQuestion'];

            if($survey['complete'] === true) {
                $objAns['complete'] = 1;
            } else if($survey['complete'] === false) {
                $objAns->complete = 0;
            }
            $objAns->save();
        }

        return;

Моя модель:

class Survey_Answer extends Model
     {
      protected $fillable = ['name', 'answers', 'complete'];
     } 

Моя миграция:

public function up()
     {
        Schema::create('survey__answers', function (Blueprint $table) {
            $table->bigIncrements('id');
              $table->bigInteger('survey_id')->unsigned()->nullable()->index();
              $table->foreign('survey_id')->references('id')->on('surveys')->onDelete('cascade');
            $table->string('name');
            $table->json('answers');
            $table->boolean('complete');
            $table->timestamps();
        });
    }

Я ожидаю, что код сохранит все, что я отправлю вместе с запросом $. Это приводит только к ошибке: преобразование массива в строку.

Большое спасибо за помощь

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вам нужно хранить $survey['answersPerQuestion'] в формате json, а не в виде массива.

$objAns->answers = json_encode($survey['answersPerQuestion']);

Хотя, как указал @Lucas Arbex в комментариях, безусловно, есть лучший способ сохранить его.

1 голос
/ 08 октября 2019

Я подозреваю, что $survey['answersPerQuestion'] - это массив, но вы пытаетесь сохранить его в столбце json.

Вы можете использовать Array & JSON Casting Laravel , чтобы привести массив кстрока json.

Тип приведения массива особенно полезен при работе со столбцами, которые хранятся в виде сериализованного JSON. Например, если ваша база данных имеет тип поля JSON или TEXT, который содержит сериализованный JSON, добавление массива, приведенного к этому атрибуту, автоматически десериализует атрибут в массив PHP при доступе к нему в модели Eloquent:

Ваша модель:

class Survey_Answer extends Model
{
    protected $fillable = ['name', 'answers', 'complete'];

    protected $casts = [
        'answers' => 'array',
    ];
}

Как только приведение приведено, вы можете получить доступ к атрибуту параметров, и он будет автоматически десериализован из JSON в массив PHP. Когда вы устанавливаете значение атрибута options, данный массив автоматически сериализуется обратно в JSON для хранения:

$user = App\User::find(1);

$options = $user->options;

$options['key'] = 'value';

$user->options = $options;

$user->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...