Laravel красноречивый цикл foreach

У меня есть цикл foreach, который проходит через массив и сохраняет данные с помощью eloquent. И это прекрасно работает, когда это так:

foreach($questions['questions'] as $question) {

    $questionObject = Question::create([
      'external_id' => $question['id'],
      'text' => $question['question_text'],
      'type' => $question['question_type'],
      'image' => (array_key_exists('question_image', $question)) ?
          $question['question_image'] : ''
    ]);

}

Но когда я добавляю условие if, я получаю неопределенную переменную с вопросом об ошибке.

foreach($questions['questions'] as $question) {

    if(!$question = Question::where('id', $question['id'])->where(
        function($query){
            $query->where('updated_at','<', $question['updated']);
        }})->first()) {

        $questionObject = Question::create([
            'external_id' => $question['id'],
            'text' => $question['question_text'],
            'type' => $question['question_type'],
            'image' => (array_key_exists('question_image', $question)) ?
                $question['question_image'] : ''
        ]);
    } else {
        return 'Question: '.$question['external_id'].' already exist.';
    }
}

Если бы кто-нибудь мог помочь мне с этим, был бы очень признателен, спасибо заранее!

2 ответа

Решение

Вы не вводите $question в вашу функцию обратного вызова. Вам нужно использовать use ключевое слово:

if(!$question = Question::where('id', $question['id'])->where(function($query) use ($question) { $query-  >where('updated_at','<', $question['updated']); })->first()) {

Обратите внимание, я добавил use ($question) немного позже function($query)

Это позволяет $question быть доступным в рамках обратного вызова.

Вы пытались использовать firstOrNew()? Документация Laravel ->

"Метод firstOrNew, например firstOrCreate, попытается найти в базе данных запись, соответствующую заданным атрибутам. Однако, если модель не найдена, будет возвращен новый экземпляр модели. Обратите внимание, что модель, возвращенная firstOrNew, еще не сохранена. в базу данных. Вам нужно будет вызвать сохранить вручную, чтобы сохранить его."

Пример (используя ваше значение $question):

foreach($questions['questions'] as $question) {
 $questionObject = Question::firstOrNew(
                array(
          'external_id' => $question['id'],
          'text' => $question['question_text'],
          'type' => $question['question_type'],
          'image' =>$question['question_image'] 

                )
        );

$questionObject->external_id = $question['id'];
$questionObject->text = $question['text'];
.
.
.
$questionObject->save();

}
Другие вопросы по тегам