Laravel中如何将当前登录用户排在列表首位?
在Laravel中实现当前登录用户的Job记录排列表首位
这需求我熟!之前做权限管理类的列表功能时刚好碰到过,Laravel里有两种很实用的实现方式,看你的具体场景选就行:
方案一:数据库层面排序(推荐,适配分页场景)
直接在查询阶段让数据库帮我们完成排序,效率更高,还能完美配合分页功能,最常用的写法是用orderByRaw加条件判断:
use Illuminate\Support\Facades\Auth; use App\Models\Job; $currentUser = Auth::user(); $jobs = Job::query() // 核心逻辑:给当前用户的记录标记优先级0,其他记录标记1,排序时0会自动排在前面 ->orderByRaw("CASE WHEN user_name = ? THEN 0 ELSE 1 END", [$currentUser->name]) ->orderBy('created_at', 'desc') // 这里可以换成你需要的其他排序规则,比如更新时间、ID等 ->get();
要是你的Job表里存储的是用户ID而非用户名,只需要把user_name换成user_id,对比值改成$currentUser->id就可以了,逻辑完全一致。
方案二:集合层面排序(适合小数据量场景)
如果你的Job数据量不大,也可以先把所有数据查询出来,再用Laravel集合的排序方法处理:
use Illuminate\Support\Facades\Auth; use App\Models\Job; $currentUserName = Auth::user()->name; $jobs = Job::all() ->sortBy(function ($job) use ($currentUserName) { return $job->user_name === $currentUserName ? 0 : 1; }) ->values(); // 重置集合的键,避免排序后出现非连续的键值影响后续使用
这个方法胜在写法灵活,但数据量大的时候不如数据库层面排序高效,而且如果需要做分页,这种方式就不太适配了,得注意场景。
小提醒
- 一定要替换代码里的
user_name为你Job表中实际存储用户标识的字段名 - 如果需要多条件排序,在
orderByRaw后面继续链式调用orderBy/orderByDesc就能叠加排序规则
内容的提问来源于stack exchange,提问作者JsWizard
相关产品推荐
相关产品推荐

