Laravel7如何根据用户表organ_id字段在控制器返回对应业务数据
问题原因
你现在的写法存在三个核心错误:
- 变量作用域错误:你在控制器类外部定义的
$organ_id属于全局变量,类内部的test方法无法直接访问,而且类外部的代码在框架加载控制器时就会执行,此时请求还没开始解析,根本拿不到当前登录用户的信息。 - 路由匹配规则错误:Laravel的路由系统只会识别控制器类下定义的公共方法,你在
test方法内部定义的orders、posts属于PHP函数,不会被路由系统识别,自然会提示方法不存在。 - 函数定义逻辑错误:PHP中函数是全局作用域的,你在两个if分支里定义同名的
orders、posts函数,只要两个分支有一个被触发,就会报函数重复定义的致命错误。
解决方法
直接把判断逻辑写到对应对外暴露的方法内部即可,不需要额外套test方法,也不需要重复定义函数:
修正后的 ProductsController.php
namespace App\Http\Controllers; use DB; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class ProductsController extends Controller { // 绑定auth中间件,保证访问以下方法的用户必须已登录 public function __construct() { $this->middleware('auth'); } // 订单方法,直接作为公共方法供路由绑定 public function orders(Request $request) { $organId = Auth::user()->getId(); // 动态拼接产品表名,避免重复代码 $data = DB::table('products_' . $organId) ->orderBy('id', 'asc') ->paginate(14); return view('products', compact('data')); } // 文章方法,直接作为公共方法供路由绑定 public function posts(Request $request) { $organId = Auth::user()->getId(); $query = DB::table('posts'); // 按机构ID走不同查询逻辑 if ($organId === 1) { $query->orderBy('id', 'asc'); $perPage = 25; } elseif ($organId === 2) { $query->orderBy('writer_id', 'asc'); $perPage = 10; } $data = $query->paginate($perPage); return view('posts', compact('data')); } // 其余方法同理,直接在方法内部加判断分支即可 }
优化建议
如果控制器里方法较多,每次都调用Auth::user()->getId()比较繁琐,可以把机构ID抽成控制器的公共属性,在构造方法里统一获取:
// 在控制器内新增属性和中间件逻辑 protected $organId; public function __construct() { $this->middleware('auth'); // 后置中间件,获取当前用户的机构ID $this->middleware(function ($request, $next) { $this->organId = Auth::user()->getId(); return $next($request); }); }
后续所有方法里直接调用$this->organId就能拿到机构编号,不需要重复写获取逻辑。
修改完成后,路由直接绑定ProductsController@orders和ProductsController@posts即可正常访问。
内容的提问来源于stack exchange,提问作者h1h2
相关产品推荐
相关产品推荐

