Laravel для каждого неопределенного ключа массива 1

#php #laravel

Вопрос:

Я пытаюсь обновить столбец для всех данных с помощью сеялки бд, но я продолжаю получать: Неопределенный ключ массива 1

Я проверил ключ $на foreach, и его значение равно 0.

 Application::chunk(500, function($applications) {
    foreach($applications as $application){
        $questions = $application->vacancy->questions()->pluck('id')->toArray();
        if(!empty($questions)){       
            foreach ($application->answers ?? [] as $key => $value) {
                $value->update(
                    [
                        'vacancy_question_id' => $questions[$key]
                    ]
                );
            }
        }
    }
});
 

Обновить

Вот соотношение для применения и ответов

 /**
 * Get the answers for the application.
 *
 * @return IlluminateDatabaseEloquentRelationsHasMany
 */
public function answers()
{
    return $this->hasMany(Answer::class);
}
 

Комментарии:

1. Какова точная ошибка, указанная PHP? «Неопределенный ключ массива 1» выглядит неправильно. Кроме того, вы можете выполнить if (empty($questions)) continue; и отменить привязку вложенного цикла for. Вы пробовали вложенный цикл for без ?? синтаксиса? Оператор слияния нулей внутри foreach, на мой взгляд, выглядит грубо.

Ответ №1:

$key находится только 0 на первой итерации foreach. Тогда, это 1 , тогда 2

Когда вы звоните dd($key); , он показывает 0 , а затем останавливает сценарий. Таким образом, вы не видите других итераций вашего foreach. Если вы хотите, чтобы сценарий продолжался , используйте dump($key); , и вы увидите, что $key это 0 так 1

В какой-то момент это должен быть индекс, которого нет в $questions массиве.

 Application::chunk(500, function($applications) {
    foreach($applications as $application){
        $questions = $application->vacancy->questions()->pluck('id')->toArray();
        if(!empty($questions)){       
            foreach ($application->answers ?? [] as $key => $value) {

                // These lines will help you identifiy the problem

                if(!array_key_exists($key, $questions)){
                   dd($key.' missing from $questions!', $key, $questions);
                }

                $value->update(
                    [
                        'vacancy_question_id' => $questions[$key]
                    ]
                );
            }
        }
    }
});
 

Комментарии:

1. Я сделал это и получил «1 пропущенный из $вопросов!» но разве ключ не должен быть равен 0 ? откуда взялась цифра 1 ? Я даже dd($ключ) внутри цикла foreach, и он дает 0.

2. dd($key.' missing from $questions!', $key, $questions); печатает все 3 вещи: $key.' missing from $questions!' , затем $key затем $questions одновременно, для целей отладки. Если у вас был 1 missing from $question , то когда $key есть 1 , он ошибается, потому $questions что не имеет 1 индекса (ключа).

3. Я обновил свой ответ объяснением того, почему вы видите только 0 тогда, когда вы dd($key);

4. это странно, почему $key увеличивается. Он должен был остановиться на цикле for. Я обновил свой вопрос, прикрепив отношения

5. $key является представлением $application->answers индекса. Если в этой коллекции есть 3 записи, то $key будет 0 , то 1 тогда 2 . Он не «увеличивается». Это просто индекс текущего $value (текущего ответа). Сказано иначе, это положение $value внутри $application->answers