You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:24:20