在Laravel应用开发过程中,经常需要根据当前登录用户的ID来筛选对应的业务数据,比如查询当前用户发布的文章、订单记录等,这时候就需要在控制器中正确添加用户ID过滤条件,避免返回其他用户的数据。

基础查询构造器过滤方式
如果使用的是查询构造器直接操作数据表,可以在控制器的方法中通过where条件添加用户ID过滤。首先需要通过Laravel的认证门面获取当前登录用户的ID,然后拼接查询条件。
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesDB;
class OrderController extends Controller
{
public function index()
{
// 获取当前登录用户ID
$userId = Auth::id();
// 按用户ID过滤订单数据
$orders = DB::table('orders')
->where('user_id', $userId)
->orderBy('created_at', 'desc')
->paginate(10);
return view('orders.index', compact('orders'));
}
}
Eloquent模型关联过滤方式
如果项目中已经定义了用户和对应数据的Eloquent模型关联关系,比如用户模型和订单模型是一对多关系,那么可以通过关联查询的方式过滤数据,这种方式更符合Laravel的ORM使用规范。
模型关联定义
首先在用户模型中定义和订单的关联:
<?php
namespace AppModels;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateDatabaseEloquentRelationsHasMany;
class User extends Authenticatable
{
// 定义用户和订单的一对多关联
public function orders(): HasMany
{
return $this->hasMany(Order::class);
}
}
控制器中使用关联查询
在控制器中可以直接通过当前用户实例调用关联方法,自动完成用户ID过滤:
<?php
namespace AppHttpControllers;
use IlluminateSupportFacadesAuth;
class OrderController extends Controller
{
public function index()
{
// 获取当前登录用户实例
$user = Auth::user();
// 通过关联查询自动过滤当前用户的订单
$orders = $user->orders()
->orderBy('created_at', 'desc')
->paginate(10);
return view('orders.index', compact('orders'));
}
}
通用过滤逻辑封装
如果多个控制器方法都需要按用户ID过滤查询,可以把过滤逻辑封装到模型的作用域中,减少重复代码。
定义局部作用域
在订单模型中定义过滤当前用户的作用域:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentBuilder;
class Order extends Model
{
// 定义按用户ID过滤的局部作用域
public function scopeForCurrentUser(Builder $query): Builder
{
return $query->where('user_id', auth()->id());
}
}
控制器中调用作用域
在控制器中可以直接使用定义的作用域方法,简化查询代码:
<?php
namespace AppHttpControllers;
use AppModelsOrder;
class OrderController extends Controller
{
public function index()
{
// 调用封装的作用域过滤当前用户数据
$orders = Order::forCurrentUser()
->orderBy('created_at', 'desc')
->paginate(10);
return view('orders.index', compact('orders'));
}
}
常见注意事项
- 过滤前一定要确认已经获取到有效的用户ID,未登录用户调用
Auth::id()会返回null,可能导致查询返回空结果。 - 数据库表的用户ID字段名需要和过滤条件中的字段名保持一致,默认是
user_id,如果是自定义字段需要对应修改。 - 不要直接接收前端传递的用户ID参数进行过滤,避免用户篡改参数查询到其他用户的数据,用户ID应该从后端认证信息中获取。
Laravel控制器用户ID过滤Eloquent查询修改时间:2026-06-25 21:51:28