Laravel构建MySQL查询:解决未定义变量错误及SQL转换
解决Laravel查询的两个问题:变量未定义错误 + 匹配原生SQL逻辑
首先来说你遇到的「Undefined variable: keyword」错误——这是因为你在闭包函数里直接使用了外部的$keyword变量,但PHP默认不会把外部变量传入闭包,得显式用use()关键字把它引进去才行。
再看你的原生SQL需求:要实现unavailable='0' AND (users.name LIKE ... OR projects.project_name LIKE ... OR resources.r_name LIKE ...)的逻辑,你原来的代码里用了orWhere()包裹闭包,而且闭包里是三个Where()(这会变成AND关系),这和原生SQL的逻辑不符,得调整一下。
下面是修正后的完整代码:
$bookings = DB::table('bookings') ->leftJoin('users', 'bookings.manager_id', '=', 'users.id') ->leftJoin('projects', 'bookings.pr_project_id', '=', 'projects.id') ->leftJoin('resources', 'bookings.pr_resource_id', '=', 'resources.id') ->where('unavailable', '=', '0') // 保持基础过滤条件 ->where(function ($query) use ($keyword) { // 用where包裹闭包,确保和前面的条件是AND关系,同时用use引入$keyword解决未定义问题 $query->where('users.name', 'LIKE', "%$keyword%") ->orWhere('projects.project_name', 'LIKE', "%$keyword%") ->orWhere('resources.r_name', 'LIKE', "%$keyword%"); // 闭包里用orWhere实现三个字段的OR匹配逻辑 }) ->orderBy('bookings.pr_working_date', 'desc') ->paginate($perPage);
关键改动说明:
- 在闭包
function ($query)后添加use ($keyword),让闭包能访问外部的$keyword变量,直接解决变量未定义的错误。 - 将外层的
orWhere()改成where(),保证unavailable='0'和后面的搜索条件组是AND关系,和原生SQL逻辑一致。 - 闭包里把后两个
Where()改成orWhere(),实现三个字段任意一个匹配关键字的OR查询逻辑。
如果$keyword可能为空,建议加个判断避免无效的%%模糊查询(可选优化):
$bookings = DB::table('bookings') ->leftJoin('users', 'bookings.manager_id', '=', 'users.id') ->leftJoin('projects', 'bookings.pr_project_id', '=', 'projects.id') ->leftJoin('resources', 'bookings.pr_resource_id', '=', 'resources.id') ->where('unavailable', '=', '0') ->when($keyword, function ($query) use ($keyword) { // 仅当$keyword存在时才添加搜索条件 $query->where(function ($subQuery) use ($keyword) { $subQuery->where('users.name', 'LIKE', "%$keyword%") ->orWhere('projects.project_name', 'LIKE', "%$keyword%") ->orWhere('resources.r_name', 'LIKE', "%$keyword%"); }); }) ->orderBy('bookings.pr_working_date', 'desc') ->paginate($perPage);
内容的提问来源于stack exchange,提问作者user7290594
相关产品推荐
相关产品推荐

