Laravel Eloquent - 按数组顺序按列对集合进行排序

Tom*_*pes 3 laravel eloquent

我希望能够按特定顺序按状态列对集合结果进行排序。

这个想法是对集合进行分页,但按特定顺序给予优先级:[2, 1, ...],因此待处理的列表首先显示,然后显示另一个!

有人对这种方法有想法吗?

提前致谢。

小智 8

如果您的状态优先级不是按数字顺序排列(例如 2 > 1 > 3 > 0),您也可以将回调函数传递给 sortBy:

$collection = collect([
    ['name' => 'A', 'status' => 0],
    ['name' => 'B', 'status' => 3],
    ['name' => 'C', 'status' => 0],
    ['name' => 'D', 'status' => 1],
    ['name' => 'E', 'status' => 2],
    ['name' => 'F', 'status' => 1],
    ['name' => 'G', 'status' => 3],
    ['name' => 'H', 'status' => 1],
    ['name' => 'I', 'status' => 2],
    ['name' => 'J', 'status' => 3],
]);

// define status priority here
$statusPriorities = [2, 1, 3, 0];

$collection->sortBy(function($order) use($statusPriorities){
   return array_search($order['status'], $statusPriorities);
})->values()->all();
Run Code Online (Sandbox Code Playgroud)

输出:

[
     [
       "name" => "I",
       "status" => 2,
     ],
     [
       "name" => "E",
       "status" => 2,
     ],
     [
       "name" => "D",
       "status" => 1,
     ],
     [
       "name" => "F",
       "status" => 1,
     ],
     [
       "name" => "H",
       "status" => 1,
     ],
     [
       "name" => "B",
       "status" => 3,
     ],
     [
       "name" => "G",
       "status" => 3,
     ],
     [
       "name" => "J",
       "status" => 3,
     ],
     [
       "name" => "A",
       "status" => 0,
     ],
     [
       "name" => "C",
       "status" => 0,
     ],
   ]
Run Code Online (Sandbox Code Playgroud)