Laravel中如何按用户角色权限展示对应Pekerjaan数据列表
问题原因
ppk身份登录后表格空白由两个核心错误导致:
- 控制器方法
tabelpekerjaan中注入的User $user没有匹配的路由参数:你的路由/datapekerjaan未定义用户ID路由段,依赖注入生成的是全新空User模型实例,调用$user->pekerjaans自然查不到任何关联数据。 - 两个权限分支返回的数据结构不一致:超管分支返回带
penyedia预加载的分页对象,ppk分支直接取关联属性返回普通集合,既没有预加载关联也没有分页,视图按统一结构渲染时就会出现空白。
修正实现
控制器逻辑修正
直接通过认证系统获取当前登录用户,保持两个分支返回结构完全一致:
<?php namespace App\Http\Controllers; use App\Models\Pekerjaan; use Illuminate\Support\Facades\Auth; class AdminController extends Controller { public function tabelpekerjaan(){ if (Auth::user()->status === 'super') { $pekerjaan = Pekerjaan::with('penyedia')->paginate(10); } else { // 直接查询当前登录用户关联的数据,保持和超管分支一致的预加载、分页配置 $pekerjaan = Pekerjaan::where('user_id', Auth::id()) ->with('penyedia') ->paginate(10); // 等价关联写法:Auth::user()->pekerjaans()->with('penyedia')->paginate(10) // 注意必须调用带括号的pekerjaans()拿到查询构造器,才能链式调用分页、预加载方法 } return view('admin.datapekerjaan', compact('pekerjaan')); } }
路由不需要修改,保持原有配置即可:
Route::get('/datapekerjaan',[AdminController::class,'tabelpekerjaan'])->name('datapekerjaan');
(可选优化)全局作用域复用权限逻辑
如果多个接口/页面都需要做Pekerjaan数据的权限过滤,可以直接在Pekerjaan模型中添加全局作用域,避免重复写权限判断:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Auth; class Pekerjaan extends Model { use HasFactory; protected $guarded = []; protected static function booted() { // 自动追加权限过滤条件 static::addGlobalScope('access_control', function ($query) { if (Auth::check() && Auth::user()->status !== 'super') { $query->where('user_id', Auth::id()); } }); } public function penyedia(){ return $this->belongsTo(Penyedia::class, 'penyedia_id'); } public function user(){ return $this->belongsTo(User::class, 'user_id'); } }
添加后控制器代码可以大幅简化,不需要再分支判断:
public function tabelpekerjaan(){ $pekerjaan = Pekerjaan::with('penyedia')->paginate(10); return view('admin.datapekerjaan', compact('pekerjaan')); }
视图适配
确认视图中遍历数据的逻辑兼容分页对象,示例写法:
<table> <thead> <tr> <th>ID</th> <th>关联Penyedia</th> <!-- 其他表头字段 --> </tr> </thead> <tbody> @foreach($pekerjaan as $work) <tr> <td>{{ $work->id }}</td> <td>{{ $work->penyedia->nama ?? '-' }}</td> <!-- 其他字段输出 --> </tr> @endforeach </tbody> </table> {{-- 渲染分页链接 --}} {{ $pekerjaan->links() }}
内容的提问来源于stack exchange,提问作者YuPi
相关产品推荐
相关产品推荐

