悠悠楠杉
掌握Laravel多级用户体系下的文章排序策略
在开发知识付费平台或会员制社区时,我们经常需要根据用户等级展示差异化的内容列表。以下是基于Laravel 9+的实现方案:
一、数据库结构设计关键点
php
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->unsignedTinyInteger('level')->default(1); // 1-5级用户体系
// ...其他字段
});
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->foreignId('userid')->constrained();
$table->unsignedTinyInteger('minlevel')->default(1); // 文章可见最低等级
// ...标题、内容等字段
});
二、核心排序逻辑实现
方案1:基础作用域查询
php
// Article模型中
public function scopeForUserLevel($query, $level)
{
return $query->where('minlevel', '<=', $level)
->orderBy('minlevel', 'desc') // 优先显示高等级内容
->orderBy('created_at', 'desc');
}
// 控制器调用
$articles = Article::forUserLevel(auth()->user()->level)->get();
方案2:多级关联排序(适用于复杂权限)
php
// User模型添加关联
public function accessibleArticles()
{
return $this->hasManyThrough(
Article::class,
UserLevelAccess::class, // 中间表记录权限关系
'user_id',
'id',
'id',
'article_id'
)->orderBy('priority', 'desc');
}
三、性能优化技巧
缓存策略:
php $articles = Cache::remember("user_{$userId}_articles", 3600, function() { return Article::with('author') ->forUserLevel(auth()->user()->level) ->take(100) ->get(); });
延迟关联加载:
php // 当需要分页时 $articles = Article::whereHas('author', function($q) { $q->where('level', '>=', auth()->user()->level); })->cursorPaginate(15);
四、前端展示逻辑示例
blade
@foreach($articles as $article)
<div class="{{ $article->min_level > 3 ? 'vip-content' : '' }}">
<h3>{{ $article->title }}</h3>
@if($article->min_level > auth()->user()->level)
<div class="upgrade-prompt">
升级到{{ $article->min_level }}级会员查看完整内容
</div>
@endif
</div>
@endforeach
五、常见问题解决方案
情景1:混合排序需求
当需要同时考虑用户等级和文章热度时,可以使用复合排序:
php
Article::query()
->selectRaw('*, (views_count * 0.3 + min_level * 0.7) as sort_score')
->orderBy('sort_score', 'desc');
情景2:动态权限变更
建议监听用户等级变更事件自动刷新缓存:
php
User::updated(function($user){
if ($user->isDirty('level')) {
Cache::forget("user_{$user->id}_articles");
}
});
总结建议
- 简单场景使用基础作用域查询即可满足
- 百万级数据量建议结合Redis有序集合
- 前端注意做好权限提示交互
- 定期使用 Telescope 监控查询性能
通过合理的排序策略实现,可以使内容展示更具商业价值,同时保持良好的用户体验。实际开发中还需根据具体业务需求调整权重算法。