#php #laravel
#php #ларавель
Вопрос:
Мне нужно зациклить $request->hasFile()
функцию как часть модуля обновления как такового;
foreach ($answers as $a) {
$ansid = 0;
$ansid = $a['id'];
$ans['quiz_content'] = $data['quiz_content_'.$a['id']];
$ans['quiz_is_answer'] = 0;
if ($data['radio-group8'] == "radio-group8_".$a['id']) {
$ans['quiz_is_answer'] = 1;
}
if ($request->hasFile('quiz_img_'.$ansid) amp;amp; $data['quiz_content_'.$ansid] == null amp;amp; !empty($data['quiz_img_'.$ansid])) {
$project_image = $request->file('quiz_img_'.$ansid);
$filename = $ansid.'answer'.time().'.'.$project_image->getClientOriginalExtension();
$destinationPath = public_path('/uploads/elearning/answers');
$project_image->move($destinationPath, $filename);
$ans['quiz_image_name'] = $filename;
$ans['quiz_content_type'] = 2;
} elseif ($request->hasFile('quiz_img_'.$ansid) amp;amp; $data['quiz_content_'.$ansid] != null amp;amp; !empty($data['quiz_img_'.$ansid])) {
$project_image = $request->file('quiz_img_'.$ansid);
$filename = $ansid.'answer'.time().'.'.$project_image->getClientOriginalExtension();
$destinationPath = public_path('/uploads/elearning/answers');
$project_image->move($destinationPath, $filename);
$ans['quiz_content'] = $data['quiz_content_'.$ansid];
$ans['quiz_image_name'] = $filename;
$ans['quiz_content_type'] = 3;
}
QuizOption::where('id', $ansid)->update($ans);
}
Однако, когда я обновлю свои параметры теста, скажем, у меня есть три варианта: a, b и c. Если я установлю изображение на a, b и c получат одно и то же изображение и один и тот же тип контента. Если я установлю изображение на b, c получит то же изображение и тип содержимого, что и b. Я знаю, что проблема связана с if($request->hasFile())
условием. но как мне закодировать его так, чтобы каждый вариант, a, b и c, имел уникальный ответ и картинку?
Комментарии:
1. Я думаю, что ваша проблема может быть в первых двух строках в цикле foreach. Чего вы действительно хотите: $ansid = 0; (чтобы быть целым числом) или $ansid = $a [‘id’]; быть чем-то из $answers? Кстати. пожалуйста, покажите нам несколько примеров, что находится в пределах $answers.
2. привет, @PowerStat . в принципе, я думал, что проблема в том, что идентификатор не сбрасывается, поэтому $ansid = 0; в начале. но, добавив $ans =[]; теперь это работает просто отлично.
Ответ №1:
Проблема, с которой вы столкнулись, на самом деле связана с тем, как вы устанавливаете $ans
переменную в цикле, а не с $request->hasFile()
вызовом. Поскольку вы никогда не сбрасываете данные внутри $ans
— только устанавливаете определенные индексы — любой набор данных во время условного, который не совпадает в будущих циклах, никогда не изменяется.
Вот упрощенный пример проблемы (просмотр результата на 3v4l.org ):
$data = array();
for ($i = 0; $i < 5; $i ) {
$data['id'] = $i;
if ($i === 2) {
$data['foobar'] = $i;
}
var_dump($data);
}
Когда if
условие проходит when $i = 2
, оно устанавливает foobar
индекс в массиве. Ни один из будущих циклов не изменяет этот индекс или не сбрасывает $data
массив.
Я бы предложил поместить $ans = [];
или аналогичный сброс в начало вашего цикла, чтобы каждый получал свежие данные, относящиеся только к его ответу.
Комментарии:
1. так что лучше использовать цикл for вместо цикла foreach в laravel? Я попробую это. спасибо, приятель!
2. Я просто использовал
for
в качестве примера, чтобы показать вам, как установка переменной в цикле влияет на ваш код. Уforeach
вас все в порядке. Пожалуйста, прочтите последнее предложение.3. ах, мой плохой, неправильно понял это. итак, в основном, прежде чем я сохраню параметры, я должен сначала поместить значения в новый массив, да?
4. это работает! сброс массива вверху, как вы сказали, очищает и дает мне свежие данные при каждой вставке. Я боролся с этим в течение 2 дней, и простая строка кода буквально решила это. большое спасибо, приятель!