【问题标题】:How to sort array data before inserting into the mysql database如何在插入mysql数据库之前对数组数据进行排序
【发布时间】:2017-11-01 10:57:33
【问题描述】:

我有一个像下面这样的表格

<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>

提交表单时,它只插入数字,我希望它获取每个数字的数字,并对它们进行排序并相应地对它们进行评分。

在我下面的图片中,id 1,2 和 10 应该有第一个位置,即“1”,然后 id 3 应该有第二个位置,即 2,等等。我尝试了我能做的,但我什至不知道如何去做做吧,我正在使用查询生成器,我已经阅读了 for 循环和 php 数组,但我不知道从哪里开始

【问题讨论】:

  • 这很正常,我们都在学习:)
  • 你只能用sql来做,有点复杂
  • @madalinivascu 谢谢,我该怎么做,我在想也许我可以使用 foreach 来获取所有数字,然后可能将其存储在某个位置,对它们进行排名,然后将它们插入数据库,但我不知道它是如何工作的,任何想法
  • 这没有意义:当您输入新数据时,位置可能会发生变化,因此您必须重新计算整个数据库。而是在需要时计算并显示位置。
  • Laravel 提供了一个辅助函数来对数组进行排序:laravel.com/docs/5.5/helpers#method-array-sort

标签: php mysql laravel laravel-5.4 laravel-5.5


【解决方案1】:

使用排名作为位置

SET @rank=0;
    select rank,score from (select @rank:=@rank+1 AS rank,score 
    from  survey  
    order by score desc) as t2

【讨论】:

  • 我如何使用查询生成器来做到这一点
  • 在不同的函数中运行这两个查询 $this->db->query('SET @rank=0'); $this->db->query('select rank,score from (select @rank:=@rank+1 AS rank,score from survey order by score desc) as t2');
【解决方案2】:

在任何控制器中都像这样,

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++;
        }
}

【讨论】:

    【解决方案3】:

    尽量在数据库前排序

    $scores = sort($request->input('student_score_number'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多