Laravel中Where查询构造器的使用:获取当前用户提交数据
Laravel按当前登录用户邮箱查询数据的正确写法
你现在的写法存在两个明显问题:
all()会先把整张表的所有数据加载到内存后再过滤,数据量较大时性能极差- 若用户未登录,
auth()->user()->email会直接触发报错
给你两种可行的解决方案:
推荐方案:控制器处理查询,视图仅负责展示
业务逻辑尽量放在控制器中完成,再将查询好的数据传递给视图:
// 对应控制器的方法示例 public function showUserForms() { // 先判断用户是否已登录 if (!auth()->check()) { // 未登录可跳转到登录页,或返回空数据,根据业务需求处理 return redirect()->route('login'); } $userEmail = strtolower(auth()->user()->email); // 直接在数据库层面过滤数据,只获取需要的记录 $formDataList = \App\Models\InsertFormModel::where('submitter', $userEmail)->get(); return view('你的视图文件名', compact('formDataList')); }
视图中直接循环展示数据:
@foreach ($formDataList as $formData) <!-- 此处编写你的数据展示代码 --> @endforeach
若需在视图中直接查询(不推荐,视图应专注于展示)
增加登录判断避免报错,同时改用数据库层面的where查询:
@auth @php $userEmail = strtolower(auth()->user()->email); $formDataList = \App\Models\InsertFormModel::where('submitter', $userEmail)->get(); @endphp @foreach ($formDataList as $formData) <!-- 数据展示代码 --> @endforeach @else <p>请登录后查看数据</p> @endauth
额外优化:给模型添加查询作用域
在InsertFormModel.php中定义一个查询作用域,后续查询会更简洁:
public function scopeSubmittedByUser($query, $user) { return $query->where('submitter', strtolower($user->email)); }
之后在控制器中可以这样调用:
$formDataList = \App\Models\InsertFormModel::submittedByUser(auth()->user())->get();
内容的提问来源于stack exchange,提问作者abrahimzaman360
相关产品推荐
相关产品推荐

