у меня есть такая форма ниже
<form action="route('docaluculation')" method="POST">
{{ csrf_field() }}
<input type="number" name="student_score_number[]">
<input type="number" name="student_score_number[]">
<input type="number" name="student_score_number[]">
<input type="number" name="student_score_number[]">
<button>Submit</button>
</form>
когда форма отправлена, она только вставляет затем число, я хочу, чтобы она получала числа по каждому номеру и сортировала их и соответственно оценивала.
На моем изображении ниже, идентификаторы 1,2 и 10 должны иметь 1-ую позицию, которая равна «1», тогда у идентификатора 3 должна быть 2-я позиция, которая равна 2, и т. Д. Я попробовал то, что я могу сделать, но я даже не знаю, как это сделать, Я использую построитель запросов, пожалуйста, я читал циклы и PHP-массивы, но я не знаю с чего начать
Используйте ранг в качестве позиции
SET @rank=0;
select rank,score from (select @rank:=@rank+1 AS rank,score
from survey
order by score desc) as t2
Как это в любом контроллере,
use App\YourNumbersModel;
public function sortNumbers(){
$groupedNumbers = YourNumbersModel::get()->orderBy('number', 'desc')->groupBy('number');
$i = 1;
foreach($groupedNumbers as $gp){
foreach($gp as $numberToSort){
$DBnumber = YourNumbersModel::where('id', $numberToSort->id)->first();
$DBnumber->position = $i;
$DBnumber->save();
}
$i++;
}
}
редактировать: просто закодировал это здесь, если у вас есть какие-либо вопросы, вы можете задать мне, надеюсь, вы понимаете, что я делаю
для этого перед вставкой вы можете использовать тот же алгоритм
public function sortNumbers($userInput){
$groupedNumbers = collect($userInput); //collect the request input with laravel eloquent
$groupedNumbers = $groupedNumbers->orderBy('number', 'desc')->groupBy('number');foreach($groupedNumbers as $gp){
foreach($gp as $numberToSort){
$DBnumber = YourNumbersModel::where('id', $numberToSort->id)->first();
$DBnumber->position = $i;
$DBnumber->save();
}
$i++;
}
}
Попробуйте отсортировать перед базой
$scores = sort($request->input('student_score_number'));