除了asc或desc之外,不按自定义顺序对Laravel Collection进行排序

时间:2019-02-19 13:39:04

标签: php laravel laravel-5

我有这个数组作为Laravel Collection:

"data": [
  {
    "id": 863368,
    "reference": "Ref 1",
    "status": 1
  },
  {
    "id": 863391,
    "reference": "Ref 2",
    "status": 2
  },
  {
    "id": 863390,
    "reference": "Ref 3",
    "status": 2
  },
  {
    "id": 863396,
    "reference": "Ref 4",
    "status": 3
  }
];

我需要按status而不是ascdesc对其进行排序,但是状态为2的记录应首先在列表上,然后状态为{ {1}},然后显示状态1

我不知道如何实现这一目标,在此先感谢您。

3 个答案:

答案 0 :(得分:4)

你有类似的问题,

$final = $collection->sortBy(function($item){
    return array_search($item->status, ['2', '1', '3']);
});

['2', '1', '3'](状态为2的状态为第一个,因为他的位置键为0,只需更改顺序即可。

或者您可以创建array之类的['2' => 1, '1' => 2, '3' => 3]

return $arry_of_order[$item->status];一样使用(更快,然后每次调用array_search

P.S。如果您可以使用数据库(MySql)(如此处的其他建议),则应坚持使用$query->orderByRaw("FIELD(status, '2', '1', '3')")

对于PostgreSQL,请看here

答案 1 :(得分:3)

您可以使用orderByRaw

Model::orderByRaw('FIELD(status, 2, 1, 3)')->get();

还通过使用orderBy

Model::orderBy(DB::raw('FIELD(status, 2, 1, 3))'))->get();

答案 2 :(得分:0)

如果要从MySQL获取数据,则可以像这样更改ORDER BY:

ORDER BY FIELD(status, 2, 1, 3)