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

如何正确编写带关联查询、orWhere及分页的Laravel Eloquent搜索代码?

问题分析与修复方案

核心问题

你代码里的错误在于先调用了get()方法——这会直接执行SQL查询并返回Eloquent集合,之后的where/orWhere都是在内存里过滤集合,而非在数据库层面执行搜索,而且paginate()方法不能用于集合,直接导致搜索逻辑完全失效。另外直接拼接字符串构造like条件存在SQL注入风险,需要用参数绑定规避。

正确代码写法

$data = Teamuser::join('teams', 'teams.id', '=', 'team_user.team_id')
    ->join('users', 'users.id', '=', 'team_user.user_id')
    ->select([
        'users.name as username',
        'teams.name',
        'users.email',
        'team_user.role',
        'team_user.id',
        'team_user.user_id',
        'team_user.team_id'
    ])
    // 仅当搜索参数存在时才添加搜索条件
    ->when($request->search2, function ($query) use ($request) {
        $searchTerm = "%{$request->search2}%";
        $query->where(function ($subQuery) use ($searchTerm) {
            $subQuery->where('users.name', 'like', $searchTerm)
                ->orWhere('teams.name', 'like', $searchTerm)
                ->orWhere('team_user.role', 'like', $searchTerm)
                ->orWhere('users.email', 'like', $searchTerm);
        });
    })
    ->paginate(5);

关键优化点

  • 用select()替代get()里的字段列表,保持查询构建器的链式调用,直到最后用paginate()执行查询
  • 用when()方法判断搜索参数是否存在,避免空搜索时生成多余的SQL条件
  • 把所有orWhere包裹在一个闭包的where()里,确保后续添加其他where条件时不会出现逻辑冲突
  • 用变量存储搜索通配符字符串,避免重复拼接,同时Laravel会自动处理参数绑定,防止SQL注入

内容的提问来源于stack exchange,提问作者ggcode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:05:35