本文详解如何在 laravel 8 的多行表单提交中,无需前端暴露 `user_id` 字段,即可在后端自动关联当前登录用户的 id 并持久化到数据库。
在使用 Laravel 8 实现动态增删多行表单(如商品库存批量录入)时,常需将每条记录与当前操作用户绑定。为保障安全性与数据一致性,绝不应依赖前端传入 user_id(易被篡改),而应在控制器中通过认证系统自动注入。
首先确保已启用 Laravel 认证(如通过 php artisan make:auth 或已配置 Auth::check()),然后修改 ProductAddMoreController@addMorePost 方法:
use Illuminate\Http\Request;
use App\Models\ProductStock; // ✅ 推荐使用模型命名空间(Laravel 8+ 默认路径)
use Illuminate\Support\Facades\Auth; // ✅ 引入 Auth 门面
public function addMorePost(Request $request)
{
$request->validate([
'addmore.*.name' => 'required|string|max:255',
'addmore.*.qty' => 'required|integer|min:1',
'addmore.*.price' => 'required|numeric|min:0.01',
]);
// ✅ 获取当前登录用户 ID(若未登录会抛出异常,建议加守卫)
$userId = Auth::id(); // 等价于 Auth::user()?->id,更安全
foreach ($request->addmore as $value) {
// ✅ 将 user_id 自动注入数据,不依赖前端输入
ProductStock::create(array_merge($value, ['us
er_id' => $userId]));
}
return back()->with('success', 'Record Created Successfully.');
}? 关键点:array_merge($value, ['user_id' => $userId]) 确保每条记录都携带认证用户 ID,且完全绕过表单字段。
protected $fillable = ['name', 'qty', 'price', 'user_id'];
public function __construct()
{
$this->middleware('auth'); // ✅ 仅认证用户可访问
}$userId = Auth::user()?->id ?? throw new \Exception('User not authenticated');Schema::table('product_stocks', function (Blueprint $table) {
$table->foreignId('user_id')->constrained()->onDelete('cascade');
});自动写入 user_id 的本质是将权限归属逻辑收归服务端——利用 Laravel 的 Auth 门面获取可信上下文,并在 create() 前动态注入。这既避免了前端安全隐患,又保持了代码简洁性与可维护性。结合中间件守卫与模型白名单控制,即可构建安全、规范的多行数据归属体系。