Помогите, разобраться. Не могу понять как можно обновить в таблице каждую запись порядковым номером. К примеру выбрал я определенное количество записей и хочу что бы в одно из полей каждой записи проставился порядковый норме. Выбрано 4 записи значит первая запись будет номер 1, вторая 2 и т.д. Вроде простая задача но начал решать и как то не через foreach не через while не получается сделать того что надо. Вот примеры как я делаю работаю в ларавел, но создал тему здесь, так как думаю что не имеет эта задача отношения к фрэймворку если не прав извиняюсь, удалю тему и перенесу. PHP: $i = 1; while($competitors_count > 0) { $i++; $competitors_count--; Competitor::where('competition_id', 28) ->update(['lot' => $i]); } понимаю что здесь на каждом проходе цикла в поле lot подставляется значение из $i и в итоге получаем в каждом поле конченое значение переменной $competitors_count также пробовал через foreach но кроме как засунуть в него цикл while больше ума не хватило, в итоге результат тоже не тот что надо. Или на каждом проходе цикла нужно писать в условие отбора записей из таблицы где поле пустое? Заранее благодарю за проявленный интерес к теме.
Есть же обычный for, а то вы счетчик успеваете увеличить до 2 перед первым обновлением. Основная проблема в том, что вы пытаетесь многократно обновлять одну и ту же запись. Нужно менять id, не забывая, что идентификаторы не «линейны», т.е. у вас должен быть заранее подготовлен список идентификаторов.
P.S. Если competition_id=28 – это признак, не имеющий отношения к id записи, то вы будете многократно обновлять все записи с этим признаком. В итоге получите во всех записях с этим признаком макс. значение счетчика. --- Добавлено --- Кста, может, в мускуле (если это мускул) есть ф-ция-генератор. Но я такой не знаю. Чтобы можно было делать SET lot=GEN() в множественном обновлении. --- Добавлено --- Можно мускульный оператор CASE использовать. Громоздко, но эффективно.
Спасибо за ответ. Правильно я понимая, что для решения задачи необходимо каждый раз обращаться к базе за новым массивом элементов, где нужное поле для вставки будет пустое, и уже туда вставлять значение увеличенное на единицу от максимального в массиве?
Про пустое поле не понял. Но походу придется обновлять всю таблицу по одной записи или блоками по неск. записей. Вообще задача странная. Нафига это?
Вот таким образом сейчас пытаюсь решить PHP: //получаю массив элементов по условию $competitors = Competitor::where('competition_id', 28)->get(); //формирую массив элементов из поля lot всех записей $competitor_lot = []; foreach ($competitors as $competitor) { $competitor_lot[] = $competitor->lot; } //пытаюсь присвоить каждому у кого поле пустое увеличенное на единицу значение от максимального в массиве $competitor_lot foreach ($competitors as $competitor) { $competitor_lotmax = max($competitor_lot); $competitor_lotmax++; if (empty($competitor->lot)) { $competitor = Competitor::where('lot', null)->first(); $competitor->lot = $competitor_lotmax; $competitor->save(); } } этот код присваивает увеличенное на единицу значение от максимального в массиве $competitor_lot но всем записям с пустым полем lot, а хотелось бы что бы в следующее пустое поле вставлялось новое значение. Где что не так делаю не пойму.
Задача эта для жеребьевки спортсменов. Выбираются спортсмены определенного соревнования и определенной весовой категории, и у кого нет номера жребия т.е поле lot пустое надо присвоить ему необходимый порядковый номер, а точнее тот которого среди спортсменов его весовой категории нет. Ну пока присваиваю увеличиный на единицу максимальный номер который есть в весовой категории, а если в весовой категории нет номер значит присваиваем 1, ну и так далее снова проходимся по массиву ищем первое попавщееся пустое поле lot, ищем максимальный номер жребия, увеличиваем на 1, присваиваем ранее найденному пустому полю.
PHP: //получаю массив элементов по условию $competitors = Competitor::where('competition_id', 28)->get(); //формирую массив элементов из поля lot всех записей $competitor_lot = []; foreach ($competitors as $competitor) { $competitor_lot[] = $competitor->lot; } $competitor_lotmax = max($competitor_lot); //пытаюсь присвоить каждому у кого поле пустое увеличенное на единицу значение от максимального в массиве $competitor_lot foreach ($competitors as $competitor) { $competitor_lotmax++; if (empty($competitor->lot)) { $competitor = Competitor::where('lot', null)->first(); $competitor->lot = $competitor_lotmax; $competitor->save(); } } Вот так работает правильно