#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