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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:10:40