Php 按自定义顺序(asc或desc除外)对Laravel集合进行排序

Php 按自定义顺序(asc或desc除外)对Laravel集合进行排序,php,laravel,laravel-5,Php,Laravel,Laravel 5,我将此阵列作为Laravel系列: "data": [ { "id": 863368, "reference": "Ref 1", "status": 1 }, { "id": 863391, "reference": "Ref 2", "status": 2 }, { "id": 863390, "reference": "Ref 3", "status": 2 }, { "id": 8

我将此阵列作为Laravel系列:

"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
  }
];
我需要按状态排序,而不是按asc或desc排序,但是状态为2的记录应该首先在列表中,然后是状态1,然后是状态3

我想不出如何做到这一点,提前谢谢你。

我也遇到过类似的问题

$final = $collection->sortBy(function($item){
    return array_search($item->status, ['2', '1', '3']);
});
编号为2的['2','1','3']状态将是第一位,因为他的位置键为0,只需根据需要更改顺序即可

或者您可以创建一个类似['2'=>1,'1'=>2,'3'=>3]的数组

使用类似退货$arry_of_order[$item->status];比每次调用数组搜索更快

另外,如果你能像其他人建议的那样使用DB MySql,你应该坚持使用,$query->orderByRawFIELDstatus,'2','1','3'

对于PostgreSQL外观,Hi也有类似的问题

$final = $collection->sortBy(function($item){
    return array_search($item->status, ['2', '1', '3']);
});
编号为2的['2','1','3']状态将是第一位,因为他的位置键为0,只需根据需要更改顺序即可

或者您可以创建一个类似['2'=>1,'1'=>2,'3'=>3]的数组

使用类似退货$arry_of_order[$item->status];比每次调用数组搜索更快

另外,如果你能像其他人建议的那样使用DB MySql,你应该坚持使用,$query->orderByRawFIELDstatus,'2','1','3'


对于PostgreSQL look

如果您从MySQL获取数据,您可以通过如下方式更改顺序:

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

如果您是从MySQL获取数据,您可以这样更改顺序:

ORDER BY FIELD(status, 2, 1, 3)
您可以使用orderByRaw获得此信息

也可以使用orderBy

您可以使用orderByRaw获得此信息

也可以使用orderBy


哦,试试看:->orderByRaw'FIELDstatus,2,1,3'的状态只能是1,2或3?或者有3个以上的状态?我想你需要一个高度重复的状态顺序。对吗?22次,1,3Oh,试试:->orderByRaw'FIELDstatus,2,1,3'的状态只能是1,2或3?或者有3个以上的状态?我想你需要一个高度重复的状态顺序。对吗?22次,1,3此溶液适合少量收集。如果一个集合太大,使用MySQL的排序会更好:@mihirbhande问题是关于laravel集合而不是DB,但是从DB排序会更快。我同意,而且你的解决方案是完全正确的,考虑到这个集合可能是通过查询构建的,我觉得值得一提this@MihirBhende非常感谢。我更新了我的答案,所以TS可以考虑到这一点。这个解决方案适合少量收集。如果一个集合太大,使用MySQL的排序会更好:@mihirbhande问题是关于laravel集合而不是DB,但是从DB排序会更快。我同意,而且你的解决方案是完全正确的,考虑到这个集合可能是通过查询构建的,我觉得值得一提this@MihirBhende非常感谢。我更新了我的答案,所以TS可以考虑到这一点。如果我尝试使用此选项,我会收到并出错:lluminate\Database\QueryException:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解在第1行“asc”附近使用的正确语法SQL:select*from scenarios order by FIELDstatus,2,1,第671行的文件/home/vagrant/code/projectresourceonline/vendor/laravel/framework/src/illighte/Database/Connection.php中有3个asc,如果我尝试使用以下内容,我会收到并出错:lluminate\Database\QueryException:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解第1行“asc”附近使用的正确语法SQL:select*from SCHENATIONS order by FIELDstatus,第671行的文件/home/vagrant/code/projectresourceonline/vendor/laravel/framework/src/light/Database/Connection.php中的2、1、3 asc