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

Laravel Voyager中如何仅展示登录用户自身的商品?

嘿,这个需求我熟!在Laravel Voyager里实现登录用户只看自己创建的商品,有几种实用的方法,咱们一个个说:

方法一:用Voyager BREAD的内置约束(最快上手)

这是最简单的方式,不用写额外代码,直接在后台配置:

  • 登录Voyager后台,找到你的Product模型对应的BREAD设置页面
  • 往下滚动到「Permissions」区域,找到「Constraint」输入框
  • 在里面填入查询条件:user_id = {{auth()->user()->id}}
  • 点击保存,刷新后台页面,现在普通登录用户只能看到自己的商品了

小提醒:如果你的系统有管理员角色,这个约束会对所有用户生效,包括管理员。要是想让管理员看到所有商品,得给管理员单独设置例外——比如先创建一个「admin」角色,然后把约束改成:
{{ auth()->user()->hasRole('admin') ? '1=1' : 'user_id = '.auth()->user()->id }}

方法二:给Product模型加全局作用域(全局生效)

这种方式会让所有调用Product模型的地方都自动应用约束,不止Voyager后台:

  1. 打开你的app/Models/Product.php,添加全局作用域:
protected static function booted()
{
    static::addGlobalScope('user_owned', function ($query) {
        // 只有非管理员用户才应用约束
        if (auth()->check() && !auth()->user()->hasRole('admin')) {
            $query->where('user_id', auth()->user()->id);
        }
    });
}
  1. 保存后,不管是Voyager后台还是你自己写的代码,查询商品时都会自动过滤出当前用户的商品,管理员不受影响
方法三:自定义Voyager控制器(最灵活)

如果需要更复杂的逻辑(比如不同角色看不同范围的商品),可以扩展Voyager的控制器:

  1. 创建自定义控制器app/Http/Controllers/Voyager/ProductController.php:
namespace App\Http\Controllers\Voyager;

use Illuminate\Http\Request;
use TCG\Voyager\Http\Controllers\VoyagerBaseController;

class ProductController extends VoyagerBaseController
{
    // 重写列表页的查询逻辑
    public function index(Request $request)
    {
        // 先获取基础查询
        $this->dataTypeContent = $this->dataType->model::query();
        
        // 给非管理员用户添加约束
        if (auth()->check() && !auth()->user()->hasRole('admin')) {
            $this->dataTypeContent->where('user_id', auth()->user()->id);
        }
        
        // 调用父类的index方法完成后续渲染
        return parent::index($request);
    }
}
  1. 在routes/web.php里替换默认的Product路由:
Route::group(['prefix' => 'admin'], function () {
    Voyager::routes();
    
    // 用自定义控制器接管Product的路由
    Route::resource('products', App\Http\Controllers\Voyager\ProductController::class)->except(['show']);
});
  1. 这样你可以在控制器里添加任意复杂的逻辑,比如根据用户的不同角色返回不同的商品集合
几个关键注意点
  • 角色判断要对应你系统里的实际角色名称,比如有的系统管理员角色叫super_admin,记得改成你自己的
  • 测试时一定要切换普通用户和管理员账号验证,确保逻辑正确
  • 如果用方法一的约束,未登录用户本来就进不了后台,所以auth()->user()不会出现null,但保险起见可以写成user_id = {{auth()->user()->id ?? 0}}避免报错

内容的提问来源于stack exchange,提问作者Mohammed Sabir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:02:00