Laravel Collection - 将特定项目放在最后位置

Laravel Collection - put specific item on last position

我有具有不同角色的数据库 table,我需要 collection,其中具有角色 owner 的项目将排在最后。这是数据库示例:

ID Role
1 admin
2 user
3 user
4 owner
5 user

如何使用这些数据对 collection 进行排序,以获得最后一个具有角色 owner 的项目?我只能想到按字母顺序排序,保存到某个变量并从 collection 中删除具有所有者角色的记录,然后最后将其粘贴到 collection 中。但这对我来说似乎不必要地复杂,有没有更简单的方法?

我之所以需要这个是因为我需要删除所有选定的用户并确保 user/owner 是最后一个。

对于eloquent,您可以将sortBy()方法与array_search()一起使用:

$collection = Model::get();

$data = $collection->sortBy(function($item){
    return array_search($item->role, ['admin', 'user', 'owner']);
});

您可以使用条件渲染。为此,您需要使用 DB::raw 示例:

Model::select('id', 'role')
  ->orderBy(DB::raw('role = "owner"'), 'ASC');

或使用shorthand:

Model::select('id', 'role')->orderByRaw("role = 'owner' ASC");

它将放在owners最后。

在此处勾选 Fiddle:http://sqlfiddle.com/#!9/9d2b64/2