【问题标题】:How to sort from highest to lowest after sum the value in Laravel?在对 Laravel 中的值求和后如何从高到低排序?
【发布时间】:2020-07-13 16:37:11
【问题描述】:

我是 Laravel 的新手。现在,我很难根据学生的总分从高到低对学生的名字进行排序。以下是我从邮递员那里得到的数据。

{ 
  "score": [
    {
        "name": "Adam",
        "sex": "male",
        "totalMarks": 250
    },
    {
        "name": "Lisa",
        "sex": "female",
        "totalMarks": 350
    },
    {
        "name": "Daniel",
        "sex": "male",
        "totalMarks": 300
    },
    {
        "name": "Mary",
        "sex": "female",
        "totalMarks": 330
    },
    {
        "name": "Sarah",
        "sex": "female",
        "totalMarks": 280
    }
  ]
}

下面是我的 ScoreController.php 代码

$class_id = $user->class->id;
$students = Students::whereIn('class_id', $class_id)->get();
$score = array();

foreach ($students as $student) {
   array_push($score, [
      'name' = $student->name,
      'sex' = $student->sex,
      'totalMarks' = $student->subjects->sum('mark'),
   ]);
}

return response()->json([
  'score' => $score,
]);

我想根据mark 的总和对学生进行排序。所以totalMarks 最高的学生应该在列表的顶部。提前谢谢你。

【问题讨论】:

  • 我相信array_multisort(array_column($score,'totalMarks'), SORT_DESC, $score); 会成功
  • @FelippeDuarte 我应该在哪里插入该代码?是在foreach 里面吗?

标签: php laravel sorting eloquent


【解决方案1】:

在这里使用雄辩的属性可能对你有好处。在你的学生类中添加一个雄辩的mutator

class Students {
    // to include it in the response.
    $with = ['totalMarks'];

    public function getTotalMarksAttribute() {
        return $this->subjects->sum('mark');
    }
}

现在您可以稍微优化您的原始代码。使用这种方法,您不必将对象转换为数组。

$students = Students::whereIn('class_id', $class_id)
    ->get()
    ->sortByDesc('totalMarks');

// laravel will automatic transform the objects, an way more maintainable approach
return response()->json([
  'score' => $students,
]);

【讨论】:

  • 更优的方法是使用 SQL 进行排序,但是看到原始问题以及您现在所处的位置,我建议的这种方法非常容易获得 :)
  • 尼斯和 Laravel 风格!
猜你喜欢
  • 2020-09-04
  • 2020-08-10
  • 1970-01-01
  • 2013-08-06
  • 2019-10-10
  • 2021-10-06
  • 2017-03-24
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多