Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Laravel 8 查询构建器:高效实现条件搜索与动态过滤_创想鸟

Laravel 8 查询构建器:高效实现条件搜索与动态过滤

Laravel 8 查询构建器:高效实现条件搜索与动态过滤

本文详细介绍了在 laravel 8 中如何利用查询构建器(query builder)或 eloquent orm 实现基于 url 查询参数的动态搜索与过滤功能。重点阐述了 `when` 方法的用法,通过条件判断优雅地向查询中添加 `where` 子句,从而避免了冗余代码,提升了代码的可读性和维护性,是处理可选搜索条件的推荐实践。

在开发 Web 应用时,基于用户输入的查询参数实现动态搜索和过滤功能是常见的需求。例如,一个管理系统可能需要根据 URL 中的 q (搜索关键词) 或 gender (性别) 参数来过滤用户列表。在 Laravel 中,优雅地处理这类可选的查询条件,是提升代码质量的关键。

动态查询条件的挑战

当我们需要根据 URL 查询字符串(如 http://127.0.0.1:8000/admin/users/supervisor?q=john&gender=m)来动态构建数据库查询时,一个常见的误区是直接将所有可能的 where 子句链式调用,而不考虑参数是否存在。

例如,以下代码在 q 或 gender 参数不存在时,会导致查询错误或行为异常:

// 潜在问题代码示例$roles = Role::where('role', '=', $role)    ->where('name', 'like', "%$request->$q%") // 如果 $request->q 不存在,会出错    ->where('gender', '=', $request->gender)   // 如果 $request->gender 不存在,会出错    ->orderBy('id', 'desc')    ->paginate(20);

其根本原因在于,当 $request->q 或 $request->gender 不存在时,它们的值可能为 null,导致 where 子句的条件不正确或抛出异常。为了解决这个问题,一种直观的方法是使用 if 语句进行条件判断:

// 使用 if 语句实现条件查询public function index (Request $request){    $role = getRoleCode($request->role);    $rolesQuery = Role::where('role', '=', $role); // 初始化查询构建器    if ($request->has('q')) { // 使用 has() 方法检查参数是否存在        $rolesQuery->where('name', 'like', '%'. $request->input('q') .'%'); // 使用 input() 安全获取参数    }    if ($request->has('gender')) {        $rolesQuery->where('gender', '=', $request->input('gender'));    }    $roles = $rolesQuery->orderBy('id', 'desc')->paginate(20);    return view('admin.users.index', [        'roles' => $roles,        // ... 其他视图数据    ]);}

这种方法是有效的,但当条件增多时,代码会显得冗长且链式调用的流畅性被中断。

Laravel when 方法:优雅的条件查询

Laravel 的查询构建器和 Eloquent ORM 提供了一个更优雅的解决方案:when 方法。when 方法允许你根据一个布尔条件来决定是否执行某个查询子句,从而使代码更加简洁和富有表现力。

when 方法的签名如下:

->when(mixed $condition, callable $callback, callable $defaultCallback = null)

$condition: 这是一个混合类型的值。如果它评估为 true(或非空、非零),则会执行 $callback。如果它评估为 false(或空、零),则如果提供了 $defaultCallback,则执行 $defaultCallback。$callback: 这是一个闭包函数,它接收当前的查询构建器实例作为第一个参数,以及 $condition 的值(如果 $condition 不是布尔值)作为第二个参数。$defaultCallback: (可选)当 $condition 为 false 时执行的闭包函数。

使用 when 方法重构动态搜索:

use IlluminateHttpRequest;use AppModelsRole; // 假设你的模型是 Rolepublic function index (Request $request){    // 假设 getRoleCode() 函数用于获取角色编码    $roleCode = getRoleCode($request->role);    $roles = Role::where('role', $roleCode) // 初始查询条件        // 当 $request->input('q') 存在且非空时,执行闭包添加 name 搜索条件        ->when($request->input('q'), function ($query, $search) {            return $query->where('name', 'like', '%'. $search .'%');        })        // 当 $request->input('gender') 存在且非空时,执行闭包添加 gender 过滤条件        ->when($request->input('gender'), function ($query, $gender) {            return $query->where('gender', $gender);        })        ->orderBy('id', 'DESC') // 排序        ->paginate(20); // 分页    return view('admin.users.index', [        'roles' => $roles,        'role_name' => config('settings.roles')[$roleCode],        'role_en_name' => $request->role,        'q' => $request->q,        'gender' => $request->gender    ]);}

代码解析:

Role::where(‘role’, $roleCode): 首先构建基础查询,筛选出特定角色的用户。->when($request->input(‘q’), function ($query, $search) { … }):$request->input(‘q’) 作为 when 方法的第一个参数($condition)。input() 方法会安全地获取请求参数,如果参数不存在则返回 null。在 PHP 中,null 会被评估为 false,非空字符串则评估为 true。如果 q 参数存在且有值,则闭包会被执行。闭包接收当前查询构建器实例 $query 和 $request->input(‘q’) 的值 $search。在闭包内部,我们通过 $query->where(‘name’, ‘like’, ‘%’. $search .’%’) 添加了 name 字段的模糊搜索条件。->when($request->input(‘gender’), function ($query, $gender) { … }):类似地,这行代码根据 gender 参数是否存在和有值,来添加 gender 字段的精确匹配条件。->orderBy(‘id’, ‘DESC’)->paginate(20): 最后,应用排序和分页。

这种方式的优点在于:

简洁性:将条件判断和查询构建融为一体,代码更紧凑。可读性:链式调用使得查询逻辑一目了然。安全性:$request->input() 自动处理参数不存在的情况,when 方法则进一步确保只有在条件满足时才添加查询子句。

注意事项与最佳实践

使用 request()->input() 或 $request->input(): 始终使用这些方法来获取请求参数,它们比直接访问 $request->q 更安全,因为它们在参数不存在时会返回 null,避免潜在的错误。通配符处理: 对于 LIKE 搜索,确保正确地在搜索关键词前后添加 % 通配符。默认值与验证: 考虑为搜索参数设置默认值,或者在控制器中对请求参数进行验证,以确保数据的有效性。复杂条件: 对于更复杂的条件逻辑,你可以在 when 闭包内部使用 orWhere、whereHas 等更高级的查询方法。代码可维护性: 当搜索条件非常多时,可以考虑将查询逻辑封装到自定义的查询作用域(Scope)中,或者使用管道模式(Pipeline Pattern)来进一步提高代码的可维护性。

总结

在 Laravel 中处理动态条件查询时,when 方法是构建灵活、可读且高效查询的强大工具。它通过将条件判断与查询构建无缝集成,显著简化了代码结构,是实现动态搜索和过滤功能的推荐实践。掌握 when 方法将使你的 Laravel 应用在处理复杂数据查询时更加健壮和优雅。

以上就是Laravel 8 查询构建器:高效实现条件搜索与动态过滤的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1338616.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP中访问包含点号的JSON对象属性
上一篇 2025年12月13日 02:13:06
PHP中SSG-WSG API的AES加密:指定初始化向量(IV)的正确实践
下一篇 2025年12月13日 02:13:17

相关推荐

  • PHP Web开发:高效处理动态数量问题答案的表单更新与ID获取

    本教程探讨在PHP Web开发中,如何高效处理具有动态数量答案的问题更新表单。针对需要同时获取答案文本值及其对应ID的场景,文章详细介绍了通过合理设计表单字段命名和利用$_POST超全局变量的键值迭代特性,实现对动态生成答案字段的准确解析和数据提取,确保更新操作的完整性。 问题背景与挑战 在开发问答…

    2026年9月24日
    100
  • Pages如何协作修改文档 Pages跟踪修改和建议的用法

    使用Pages的协作与修订功能可高效编辑文档,先启用共享邀请协作者,再通过建议模式提出修改,所有更改以标记形式显示,经审查后接受或拒绝,最终关闭修订模式保存定稿。 如果您正在与团队成员共同编辑一份文档,但希望保留原始内容并记录所有更改建议,可以使用 Pages 的协作与修订功能来实现高效沟通。通过这…

    2026年9月24日
    100
  • Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪

    Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪Polarr的AI工具怎么裁剪图片?教你轻松实现高效图像裁剪

    Polarr的AI裁剪通过内容感知智能识别主体与构图焦点,提供如主体居中、构图优化和比例推荐等方案,操作上先导入图片,选择裁剪工具后AI即分析画面并生成多个推荐预设,用户可直接应用或手动微调,相比传统裁剪显著提升效率、辅助构图决策,尤其适用于社交媒体多平台比例适配,帮助保持视觉一致性并避免关键信息被…

    2026年9月24日 • 用户投稿
    600
  • VSCode如何运行终端命令 VSCode内置终端的使用指南

    在VSCode里运行终端命令,最直接、最核心的方式就是利用它内置的集成终端。这玩意儿简直是开发者工作流的“心脏”,你可以在不离开编辑器界面的情况下,直接敲入并执行各种命令行操作,无论是跑测试、安装依赖,还是启动项目,都方便得要命。它把代码编辑和命令执行无缝衔接起来,大大减少了上下文切换的开销。 解决…

    2026年9月24日
    200
  • qq浏览器怎么看3d网页效果_QQ浏览器体验WebGL 3D网页效果指南

    首先启用QQ浏览器的高速渲染组件并确保其已安装开启,然后将页面切换至极速模式以支持WebGL,接着更新显卡驱动以保障图形渲染正常,最后清除浏览器缓存与重置设置排除故障,按此步骤可解决3D网页黑屏、白屏问题。 如果您尝试在QQ浏览器中查看3D网页效果,但页面无法正常显示或出现黑屏、白屏,可能是由于浏览…

    2026年9月24日
    100
  • 解决AWS S3 PHP SDK中SSL连接失败问题:证书验证与文件句柄限制

    本文旨在帮助开发者解决在使用AWS S3 PHP SDK时遇到的SSL连接失败问题,错误信息包括“fopen(): SSL operation failed with code 5”和“certificate verify failed”。文章将深入分析错误原因,并提供修改php.ini配置,指定证…

    2026年9月24日
    200
  • 前端的设计模式系列-基本原则

    在完成对二十三个经典设计模式的讲解后,我们再来回顾一下一些基本原则,以便在日常开发中更好地理解和应用这些概念。 单一职责原则(SRP,Single Responsibility Principle)定义:一个类或模块应该有且仅有一个改变的原因。在 JavaScript 中,这更多地应用于对象和函数。…

    2026年9月24日
    200
  • 一加Pro系列应用无法卸载怎么办?教你绕过限制删除应用

    若一加Pro系列手机应用无法卸载,首先检查是否具备设备管理权限,进入设置-安全与隐私-设备管理应用,取消激活后即可卸载;若为预装应用,可通过应用管理禁用;对于顽固应用,可使用ADB命令强制卸载,需启用USB调试并执行pm uninstall命令;若应用锁定进程,可重启至安全模式后卸载。 如果您尝试从…

    2026年9月24日
    100
  • VSCode 怎样设置文件的自动命名规则 VSCode 文件自动命名规则的设置技巧​

    vscode 本身不提供图形界面设置文件自动命名,但可通过配置 emmet.variables 和使用插件实现;2. 可在 settings.json 中添加如 “emmet.variables”: { “today”: “${tm_yea…

    2026年9月24日
    100
  • Pages怎么进行邮件合并 Pages批量生成信函的实用功能

    使用Pages邮件合并功能可批量生成个性化文档。首先准备通讯录或Numbers表格形式的联系人列表,确保信息完整、格式清晰;接着在Pages中创建主文档模板,输入通用内容并通过“链接到联系人”插入动态字段;然后在“设置”中启用“邮件合并”,选择数据源并确认字段映射正确;最后导出为单个文件或批量生成P…

    2026年9月24日
    200
  • 有选择性地移除 WooCommerce 订单邮件中的产品购买备注

    本文将指导您如何针对特定的 WooCommerce 订单邮件通知,有选择性地移除产品购买备注,避免在所有邮件中都隐藏该信息。 使用 WooCommerce 钩子和全局变量进行控制 WooCommerce 允许开发者通过钩子(hooks)修改其核心功能。为了实现我们的目标,我们需要使用 woocomm…

    2026年9月24日
    300
  • 升级Windows 10/11出现0xC1900101错误怎么办?

    错误代码0xC1900101通常由驱动冲突、磁盘空间不足或系统文件损坏引起。1、通过设备管理器更新过时驱动;2、确保C盘有20GB以上空间并清除SoftwareDistribution文件夹;3、使用SFC和DISM命令修复系统文件;4、重置Windows Update相关服务为自动启动并重启服务。…

    2026年9月24日
    200
  • 如何用HornilStylePix的AI裁剪图片?快速完成精准裁剪步骤

    HornilStylePix的AI裁剪功能可智能识别主体并推荐裁剪方案,支持手动调整与多种比例选择,提升裁剪效率和准确性,同时软件还具备调色、滤镜、批量处理等实用编辑功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ HornilStyl…

    2026年9月24日
    800
  • win8如何查看系统日志_Win8系统日志查看教程

    win8如何查看系统日志_Win8系统日志查看教程win8如何查看系统日志_Win8系统日志查看教程win8如何查看系统日志_Win8系统日志查看教程win8如何查看系统日志_Win8系统日志查看教程

    首先打开事件查看器,依次通过Win+R输入eventvwr.msc进入,查看Windows日志中的系统和应用程序类别,筛选错误或警告事件,最后可将日志另存为.evtx文件用于分析。 如果您在使用Windows 8系统时遇到程序崩溃、系统异常重启或登录问题,查看系统日志是定位故障的关键步骤。通过分析日…

    2026年9月24日 • 用户投稿
    300
  • 宝塔面板使用`Navicat`或其他工具连接数据库

    宝塔面板使用`Navicat`或其他工具连接数据库宝塔面板使用`Navicat`或其他工具连接数据库宝塔面板使用`Navicat`或其他工具连接数据库宝塔面板使用`Navicat`或其他工具连接数据库

    在linux系统上配置环境确实可能有些复杂,因此许多用户选择安装一个可视化面板,如宝塔面板。然而,当使用sql管理工具如navicat连接数据库时,可能会遇到连接问题。以下是如何解决这些问题的详细步骤,以navicat为例。 果不其然,直接无法连接上。 首先,我们需要检查服务器是否开放了3306端口…

    2026年9月24日 • 用户投稿
    900
  • VSCode如何设置智能代码重构建议 VSCode自动化重构工具的配置优化

    vscode的智能代码重构建议不出现时,首先检查文件类型是否受支持、对应语言扩展是否安装启用、项目根目录是否有jsconfig.json或tsconfig.json等配置文件;2. 确保editor.lightbulb.enabled为true以显示灯泡提示;3. 通过设置editor.codeac…

    2026年9月24日
    700
  • phpMyAdmin快速导出文件字符集配置指南

    本文详细介绍了phpMyAdmin快速导出功能中文件字符集的默认设置及其配置方法。默认情况下,快速导出生成的文件采用UTF-8编码。用户可以通过修改phpMyAdmin的配置文件config.inc.php,利用$cfg[‘Export’][‘charset&#8…

    2026年9月24日
    100
  • 基于属性配置动态创建 Spring Boot Bean

    本文介绍了如何在 Spring Boot 应用中基于配置属性的值动态创建 Bean。通过使用 @ConditionalOnProperty 注解,可以根据指定的属性是否存在以及其值来决定是否创建某个 Bean,从而实现灵活的配置和 Bean 的动态加载。本文将提供详细的代码示例和使用说明,帮助开发者…

    2026年9月24日
    100
  • 香香漫画官方版入口2025 香香漫画正版免费阅读地址

    香香漫画官方版入口2025为https://www.xiangxiangmanhua.com,用户可通过该网址访问平台,享受涵盖恋爱、校园等多种题材的免费高清漫画资源,支持搜索、同步更新与跨设备阅读,并提供夜间模式、离线缓存等优化体验。 香香漫画官方版入口2025在哪里?这是不少网友都关注的,接下来…

    2026年9月24日
    200
  • UC浏览器在线使用官方入口 UC浏览器最新官网

    UC浏览器官方入口是https://www.uc.cn/,该官网提供最新版下载及核心功能如智能搜索、流量压缩、视频优化和夜间模式,并支持跨平台使用与数据同步。 UC浏览器在线使用官方入口在哪里?这是不少用户关心的问题,接下来由PHP小编为大家带来UC浏览器最新官网地址以及相关功能特点,想要了解这款浏…

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信