【Laravel高级开发必修课】:用模型作用域提升代码质量的7种方式

第一章:Laravel模型作用域的核心概念与价值

在 Laravel 框架中,模型作用域(Model Scopes)是一种强大的机制,用于封装 Eloquent 模型中常用的查询逻辑。通过定义作用域,开发者可以将复杂的数据库查询条件抽象为可复用的方法,从而提升代码的可读性与维护性。

什么是模型作用域

模型作用域分为两种类型:局部作用域(Local Scopes)和全局作用域(Global Scopes)。局部作用域是开发者在模型中自定义的查询方法,以 scope 前缀命名;全局作用域则自动应用于所有查询,常用于实现软删除或租户隔离等跨业务逻辑。

局部作用域的定义与使用

以下是一个定义局部作用域的示例,用于获取所有启用状态的用户:
class User extends Model
{
    // 定义局部作用域
    public function scopeActive($query)
    {
        return $query->where('status', 'active');
    }
}
调用该作用域时,只需链式调用 active() 方法:
// 获取所有活跃用户
$users = User::active()->get();
此方式使查询语句更具语义化,避免重复编写相同条件。

全局作用域的应用场景

全局作用域通过实现 Illuminate\Database\Eloquent\Scope 接口来定义,并在模型的 booted 方法中注册。它适用于需要对所有查询统一过滤的场景,例如多租户系统中自动添加租户 ID 条件。
  • 提高代码复用性,减少重复查询逻辑
  • 增强业务语义表达,使代码更易理解
  • 支持链式调用,与其他查询构造器无缝集成
作用域类型定义方式应用场景
局部作用域以 scope 开头的方法特定查询条件封装
全局作用域实现 Scope 接口全表查询自动过滤

第二章:本地作用域的实践应用技巧

2.1 理解本地作用域的定义与语法结构

本地作用域(Local Scope)是指在函数或代码块内部声明的变量所处的作用域,其生命周期仅限于该函数或块执行期间。
本地变量的声明与可见性
在函数内使用 var、let 或 const 声明的变量属于本地作用域,外部无法访问。

function example() {
    let localVar = "I'm local";
    console.log(localVar); // 输出: I'm local
}
// console.log(localVar); // 报错:localVar is not defined
上述代码中,localVar 仅在 example() 函数内有效,函数外访问会触发引用错误,体现了本地作用域的封装特性。
块级作用域的扩展
使用 let 和 const 在 {} 块中声明的变量也受本地作用域限制。
  • 函数作用域:由 function 创建
  • 块作用域:由 {} 创建,如 if、for
  • 变量提升:var 存在提升,let/const 有暂时性死区

2.2 封装常用查询条件提升代码复用性

在构建数据访问层时,频繁编写的查询条件容易导致代码重复。通过封装通用查询逻辑,可显著提升代码的可维护性与复用性。
查询条件的抽象设计
将常见的分页、排序、模糊匹配等条件提取为结构体或函数参数,便于统一管理。

type QueryOptions struct {
    Page     int
    PageSize int
    Keywords string
    OrderBy  string
}

func BuildQuery(opts QueryOptions) *gorm.DB {
    db := db.Table("users")
    if opts.Keywords != "" {
        db = db.Where("name LIKE ?", "%"+opts.Keywords+"%")
    }
    if opts.OrderBy != "" {
        db = db.Order(opts.OrderBy)
    }
    return db.Offset((opts.Page - 1) * opts.PageSize).Limit(opts.PageSize)
}
上述代码中,`QueryOptions` 封装了常见查询参数,`BuildQuery` 根据选项动态拼接 SQL 条件。该方式避免了在多个服务中重复编写相似的 WHERE 或 LIMIT 语句。
  • Page 和 PageSize 控制分页偏移,防止数据过载
  • Keywords 实现模糊搜索,增强检索灵活性
  • OrderBy 支持动态排序,适配多场景需求

2.3 带参数的作用域实现动态数据过滤

在现代ORM框架中,带参数的作用域是实现动态数据过滤的核心机制。通过预定义可复用的查询片段,结合运行时传入的参数,能够灵活构建条件表达式。
参数化作用域定义
func FilterByStatus(status string) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        if status != "" {
            return db.Where("status = ?", status)
        }
        return db
    }
}
该函数返回一个作用域闭包,接收数据库实例并动态附加WHERE条件。参数status控制是否启用过滤,空值则跳过条件拼接。
链式调用示例
  • 构建多条件查询:db.Scopes(FilterByStatus("active"), Paginate(1, 20))
  • 支持组合复用,提升代码可维护性
  • 避免SQL注入,参数自动转义

2.4 链式调用多个作用域构建复杂查询

在现代ORM设计中,链式调用是构建动态、可复用查询逻辑的核心机制。通过将查询条件封装为独立的作用域(Scope),开发者可以在运行时按需组合多个条件。
作用域的定义与复用
每个作用域返回一个函数,接收数据库会话对象并返回增强后的查询句柄:
func WithStatus(status string) func(*gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        return db.Where("status = ?", status)
    }
}

func WithCreatedAt(from, to time.Time) func(*gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        return db.Where("created_at BETWEEN ? AND ?", from, to)
    }
}
上述代码定义了两个作用域:WithStatus 用于过滤状态值,WithCreatedAt 限定创建时间范围。两者均符合 GORM 的作用域签名规范。
链式组合实现复杂查询
多个作用域可通过连续调用进行叠加:
db.Scopes(WithStatus("active"), WithCreatedAt(start, end)).Find(&users)
该语句等价于拼接 WHERE 条件:status = 'active' AND created_at BETWEEN start AND end。GORM 按调用顺序合并所有条件,形成最终SQL,提升代码可读性与维护性。

2.5 避免常见陷阱:作用域命名与可读性优化

命名冲突与作用域污染
在大型项目中,全局变量容易引发命名冲突。应优先使用块级作用域变量,避免污染全局环境。

// 错误示例:全局污染
let data = '临时数据';
function processData() {
  data = '处理中'; // 意外修改外部变量
}

// 正确做法:限制作用域
function safeProcess() {
  let data = '局部数据'; // 块级作用域
  console.log(data);
}
上述代码通过 let 在函数内创建独立作用域,防止外部干扰,提升可维护性。
提高可读性的命名策略
使用语义化名称能显著增强代码理解效率。避免缩写或模糊词汇。
  • 推荐: userAuthenticationToken
  • 避免: tok 或 uat
清晰命名使团队协作更高效,降低后期维护成本。

第三章:全局作用域的高级控制策略

3.1 全局作用域的注册与自动应用机制

在现代前端框架中,全局作用域的注册机制允许组件、指令或插件在初始化阶段自动挂载到应用实例上,无需显式调用。这种机制通过内部的依赖注入系统实现,确保资源在整个应用生命周期内可访问。
自动注册流程
框架启动时会遍历配置中的全局模块,并执行其 install 方法。该方法接收应用实例作为参数,进行属性或方法的挂载。
MyPlugin.install = function (app) {
  app.config.globalProperties.$myMethod = () => {
    console.log('Global method invoked');
  };
};
上述代码将 $myMethod 注册为全局方法,所有组件实例均可通过 this.$myMethod() 调用。其中 app 为应用上下文,config.globalProperties 是代理挂载点。
注册优先级表
阶段执行内容是否异步
1核心插件注册否
2用户自定义模块可选

3.2 使用全局作用域实现软删除增强逻辑

在现代ORM框架中,软删除常通过标记字段(如 deleted_at)实现。利用全局作用域可统一拦截查询,自动过滤已删除记录。
全局作用域注入
// 定义模型时注册全局作用域
func (User) QueryScopes(db *gorm.DB) *gorm.DB {
    return db.Where("deleted_at IS NULL")
}
该作用域自动应用于所有查询,确保业务层无需关心数据可见性。
恢复机制与条件覆盖
  • 使用 Unscoped() 临时关闭全局过滤
  • 支持历史数据审计与误删恢复
  • 结合索引优化,避免全表扫描
通过此设计,软删除逻辑集中管控,降低代码冗余,提升数据安全性与一致性。

3.3 多租户架构下的数据隔离实战

在多租户系统中,确保不同租户间的数据安全与独立是核心挑战。常见的隔离策略包括共享数据库+共享表(通过租户ID区分)、共享数据库+独立表、独立数据库等。
基于租户ID的行级隔离
最常见的方式是在共享表中添加 tenant_id 字段,所有查询均需带上该条件。
SELECT * FROM orders WHERE tenant_id = 'tenant_a' AND status = 'paid';
此查询通过 tenant_id 过滤,确保租户A只能访问自身订单数据。需配合数据库索引优化性能,建议在 (tenant_id, created_at) 上建立复合索引。
应用层拦截机制
为避免遗漏 tenant_id 条件,可在ORM层自动注入租户上下文:
  • 用户登录后,解析JWT获取 tenant_id
  • 请求上下文中绑定租户标识
  • DAO层自动拼接查询条件

第四章:作用域在典型业务场景中的深度整合

4.1 在用户权限系统中集成角色过滤作用域

在现代权限控制系统中,基于角色的数据访问隔离是核心需求之一。通过引入角色过滤作用域,可实现对资源查询的自动拦截与数据过滤。
作用域定义与实现
以 GORM 为例,可通过全局 Scope 实现角色驱动的数据过滤:

func RoleFilterScope(role string) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        if role == "admin" {
            return db // 管理员可见所有数据
        }
        return db.Where("tenant_id = ?", getTenantIDByRole(role))
    }
}
该函数返回一个动态查询作用域,根据当前用户角色自动附加 WHERE 条件,确保非管理员仅能访问所属租户数据。
注册全局作用域
  • 在模型初始化时调用 db.Scopes() 注入过滤逻辑
  • 结合中间件动态解析用户角色,传递至查询上下文
  • 支持多层级角色继承,提升策略复用性

4.2 商品查询中结合搜索与状态筛选作用域

在商品管理模块中,高效的数据检索依赖于搜索条件与状态筛选的协同作用。通过构建复合查询作用域,系统可精准定位目标商品。
查询作用域的组合逻辑
将关键字搜索与上下架状态、审核状态等筛选条件合并,形成链式查询。以 GORM 为例:

db.Where("name LIKE ?", "%"+keyword+"%").
   Where("status = ?", status).
   Where("is_published = ?", published)
上述代码通过多个 Where 条件叠加,实现动态拼接 SQL 查询。参数 keyword 支持模糊匹配,status 和 published 精确过滤商品当前所处业务阶段。
性能优化建议
  • 为常查字段建立复合索引,如 (status, is_published, name)
  • 避免全表扫描,确保查询走索引覆盖

4.3 日志审计模块中的时间范围作用域封装

在日志审计系统中,时间范围是查询与分析的核心维度。为提升查询效率与代码可维护性,需对时间范围进行作用域封装。
封装设计原则
通过结构体统一管理起始时间、结束时间和时区信息,避免分散传递参数。

type TimeRange struct {
    Start time.Time
    End   time.Time
    Zone  *time.Location
}

func (tr *TimeRange) Contains(t time.Time) bool {
    return t.After(tr.Start) && t.Before(tr.End)
}
上述代码定义了时间范围的基本结构及其包含判断逻辑。Start 和 End 字段标识时间段边界,Zone 确保时区一致性。Contains 方法用于判定某时间点是否落在审计窗口内,适用于日志过滤场景。
应用场景示例
  • 按天划分审计区间,支持滚动周期查询
  • 结合数据库 WHERE 条件生成时间谓词
  • 作为中间件注入上下文,限制用户数据访问范围

4.4 关联关系查询中作用域的协同使用

在复杂的数据访问场景中,关联关系查询常需结合作用域(Scope)实现动态条件过滤。通过将作用域与关联模型组合,可灵活控制查询上下文。
作用域的链式调用
多个作用域可通过链式调用叠加生效,尤其适用于多层级关联查询:
// 定义用户模型的作用域
func ActiveUsers(db *gorm.DB) *gorm.DB {
    return db.Where("status = ?", "active")
}

func InDepartment(deptID uint) func(*gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        return db.Where("department_id = ?", deptID)
    }
}

// 在预加载中协同使用
db.Scopes(ActiveUsers).Preload("Orders", InDepartment(deptID)).Find(&users)
上述代码中,Scopes 应用于主模型,而 Preload 内的作用域则限定关联数据的加载条件,实现主从数据的联合过滤。
查询逻辑协同示意图
主查询 → 应用作用域A → 加载关联 → 关联查询应用作用域B → 返回联合结果

第五章:模型作用域的最佳实践与性能建议

合理定义作用域边界
在复杂系统中,模型的作用域应严格限定于业务上下文。避免全局共享状态,减少耦合。例如,在 Go 语言中可通过包级私有结构体控制访问:

package user

type user struct { // 私有类型
    ID   int
    Name string
}

func GetUser(id int) *user {
    return &user{ID: id, Name: "Alice"}
}
延迟加载与预加载策略
根据访问频率决定是否启用预加载。高频访问关联数据时,使用预加载减少 N+1 查询;低频则采用延迟加载节省内存。
  • 预加载适用于用户配置、权限角色等静态数据
  • 延迟加载适合评论、日志等大容量从属资源
  • ORM 中可通过 With() 或 Eager() 方法显式声明
缓存层级设计
建立多级缓存机制提升读取性能。结合本地缓存(如 Redis)与数据库查询优化器提示:
缓存层级适用场景过期策略
本地内存高频读、低更新TTL 60s
分布式缓存跨节点共享数据滑动过期 300s
避免作用域污染

请求入口 → 创建局部作用域 → 绑定上下文模型 → 执行业务逻辑 → 销毁作用域

确保每个请求拥有独立模型实例,防止数据交叉污染。使用 context.Context 传递作用域生命周期信号,及时释放资源。
判断两个多边形是否相交(java实现) 判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景 阅读详情

相关推荐

基于STM32的超声波流量计设计

本项目基于STM32微控制器设计了一种超声波流量计,采用时间差法测量液体或气体的流速,计算流量并通过显示屏实时显示,同时支持远程数据传输。本设计通过STM32微控制器实现了基于时间差法的超声波流量计,集成了超声波信号采集、流量计算、状态显示和远程通信功能。本系统需要实现超声波信号的实时采集与处理,计算流速和流量,并将数据通过OLED显示和无线模块上传。系统需具备高精度的时间测量能力和良好的抗干扰能力。通过计算超声波在顺流和逆流方向上的传播时间差,结合管道直径与流体特性,计算流速并进一步计算流量。

stm32d1219的博客 2349

laravel模型的scope前缀方法

Laravel中模型中可以定义scope开头方法,这类方法可以通过模型直接调用。 这类方法也称作查询作用域 参考文档:https://laravel-china.org/docs/laravel/5.6/eloquent 例如, 你可能经常需要获取「受欢迎的」用户。要定义这样一个范围,只需要在对应的 Eloquent 模型方法前加入 scope 前缀。scope方法总是返回一个查询构造器实例。...

Dev-Liangjian的博客 1920

【训练】Qwen2.5VL 多机多卡 Grounding Box定位

之前的相关文章:【深度学习】LLaMA-Factory微调sft Qwen2-VL进行印章识别使用LLaMA-Factory微调sft Qwen2-VL-7B-Instruct构建最新的LLaMA-Factory镜像。

q742971636的博客 2583

Laravel模型里定义查询作用域scope前缀的方法

本地作用域: 在模型Model中定义   public function scopeMe($query)     {         $query->where('owner_id','=',Auth::guard('api')->id());     } 在控制器的使用  $list = Template::where('is_check', $request->...

cfun_goodmorning的博客 2252

基于YOLOv26的道路抛洒物检测系统原理实现

本文提出了一种基于YOLOv26的道路抛洒物智能检测系统,通过深度学习技术实现道路抛洒物的实时检测与分类。系统采用分层架构设计,包含视频采集、目标检测、分类评估和预警处理等模块,能够自动识别轮胎碎片、货物包装、金属零件等多种抛洒物,并根据危险程度分级预警。YOLOv26算法在检测精度和速度上的优势使其特别适合道路监控场景,结合背景建模和运动目标提取技术,有效提高了复杂道路环境下抛洒物的识别率。该系统可集成到现有智能交通监控平台,为道路安全管理提供实时决策支持。

一键难忘的博客 1253

[SVA]SystemVerilog Assertion Property开发技巧总结

SystemVerilog Assertion开发技巧总结 一、在property中可以使用if-else条件语句 如下面的例子,根据misc_phy_12g_rx的取值,选择不同的判断语句 property ck1_en_rose_chk(); @(posedge clk) disable iff(~rst_n) ad_pn_ck1en & (current_state !== ST_IDLE) |->...

元直的博客 5924

laravel scope作用域的使用

场景 在项目中 经常会面对一些条件的查询,这些查询条件好些是相同的。scope可以实现这些相同条件的复用. 局部作用域 这种用法是最常见的场景. eg: 一个论坛的问题的发布系统肯定是有一项是隐藏帖子,不显示给其他人看. 写法 1. 命名方式 . scope+自定义的方法名 2. 传参 . 第一个参数...

cominglately的博客 2879

大模型安全研究论文整理 2026年版

知乎博主小红书博主GitHub数据集参考: 大模型越狱指令 (harmful questions) 数据集整理会思考的大模型更不听话,我的豆包失控了…让QwQ思考模型-不思考的小技巧qwen3的致命幻觉!大模型微调所有大模型都在讨好人类不要思考过程,推理模型能力能够更强丨UC伯克利等最新研究o3/o4-mini幻觉暴增2-3倍!OpenAI官方承认暂无法解释原因UC伯克利:让推理模型少思考,准确率反而更高了!一句话让DeepSeek思考停不下来,北大团队:这是针对AI的DDoS攻击慢思考准确率反降30%!普

CSPhD-winston的博客 2032

laravel中scope的用法以及技巧

laravel中scope的用法以及技巧 laravel中的scope作用域 laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理 也就是在模板定义方法中,加上前缀scope。 简言之,Laravel中模型中可以定义scope开头方法,这类方法可以通过模型直接调用。这类方法也称作查询作用域。 <?php namespace App; use Il...

WXiangQian 5928

【OpenClaw从入门到精通】第05篇:实战!OpenClaw自动化搞定邮件/日历/文件管理(2026实测避坑版)

本文聚焦OpenClaw核心实用场景,手把手教你实现邮件、日历、文件管理的全自动化。通过安装三大核心技能,配置IMAP/SMTP邮箱、跨平台日历及文件沙盒权限,结合4个虚拟实战案例,演示从邮件自动摘要、会议冲突预警到下载文件夹分类的完整流程。文中包含2026实测的命令代码、配置步骤、排障方案,所有案例需在测试环境验证,代码未上传GitHub。兼顾新手入门与进阶需求,让OpenClaw从“能聊天”升级为“能干活”,帮你节省80%重复工作时间。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2676

【文献笔记】CVPR 2023|Attention-Based Point Cloud Edge Sampling

优点能够有效采出点云数据的边缘点分类任务性能优越不足没有设计出一个更好的上采样方法,导致分割任务的性能略低只考虑了边缘特征,没有利用其他几何特征。

m0_55908255的博客 319

Laravel 模型的 scope 普通用法和全局用法

在数据查询中经常会使用条件查询,这些查询条件有些是相同的,scope可以实现这些相同条件查询的复用。 普通 scope 定义 方法名为 scope + 首字母大写单词 (这个可以随便定义) public function scopeStatus($query) { return $query->where('status',1); } 使用 其中调用去掉 scope 后,首字母小写的那个函数。 scopeStatus () 调用 status ()。 User::status()->

Peak Xin's Blog 1075

vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支持对表格进行修改|新增|删除,解决完成操作后树节点不刷新问题(提供示例代码,一键复制开箱即用

vue2,vue3,elementui,elementPlus,el-table,Table表格组件,表格懒加载数据,element table表格数中的树形结构懒加载,增加后数据不同步更新问题,el-table树形与el-tree树形结构的一键折叠与展开,elementui中el-tree懒加载数据 默认展开最外层节点,Element-plus Table组件树表结构默认展开一级目录,vue实现element table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题,解决el-tre

✅ 精选推荐文章 1万+

PHP学习心得

同时,在学习过程中要注意好的代码风格、RESTful API设计规范等方面,这些都会影响到你所编写的代码质量和效率。而我在学习Laravel的过程中体会到了很多收获,开拓了我的视野,提升了我的编程能力。Laravel提供了一系列的迁移功能,让你可以方便地创建和管理数据库,同时也保证了数据的安全性。Laravel的控制器是Web应用程序的核心部分之一,在它的帮助下你可以方便地管理对数据库的访问以及业务逻辑的关联性。控制器是Web请求的最终目的地。后台包括:栏目的增删改查,内容的增删改查,广告的增删改查。

m0_73872513的博客 165

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

360春招PHP笔试客观题全解析:核心考点与答题策略

在PHP开发者的求职准备中,基础知识的扎实程度往往比算法题更早受到考验。大厂笔试常以客观题作为第一道门槛,用来高效扫描候选人的知识面与工程经验。这类题目覆盖范围广,从PHP变量作用域、数组函数、运算符优先级,到面向对象魔术方法与延迟静态绑定,再到MySQL索引、事务隔离级别、HTTP状态码以及SQL注入、XSS、CSRF等Web安全要点,都是高频出题区域。理解这些考点的底层原理,不仅有助于应对笔试中的选择题与判断题,更能帮助开发者在实际项目中避开常见陷阱,提升代码质量。从通用技术概念出发,逐步深入到具体语言

weixin_33858336的博客 398

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

PHP参数名传参陷阱:点号、减号等非法字符的转换机制与实战解决方案

在Web开发中,HTTP参数传递是前后端交互的基础。PHP作为广泛使用的服务器端语言,其核心机制会对传入的参数名进行特定处理,将非字母数字字符(如点号、减号)自动转换为下划线。这一行为源于PHP早期为兼容变量名所做的设计,虽提升了便利性,却埋下了数据丢失和逻辑错误的隐患。理解这一原理对编写健壮、安全的代码至关重要,尤其在构建API、处理表单或进行安全审计时。本文聚焦于PHP参数名解析的常见陷阱,例如点号、减号导致的键名转换,以及PHP 8.x版本中相关指令(如track_errors)的变化。通过剖析真实故

weixin_34377919的博客 512

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

PHP后端安全实战:SQL注入与XSS攻击的防御体系构建

在Web开发领域,后端安全是保障应用稳定运行和数据隐私的基石。其核心原理在于对用户输入与输出的严格管控,防止恶意数据被解释为可执行代码。从技术价值看,健全的安全机制能有效抵御数据泄露、服务瘫痪等风险,是构建可信赖应用的关键。尤其在PHP后端开发中,SQL注入与跨站脚本攻击(XSS)是最常见且危害巨大的安全威胁。针对SQL注入,参数化查询通过分离SQL结构与数据,从根本上杜绝了恶意代码注入;而防御XSS则依赖于对输出内容的精准转义,确保用户输入在HTML、JavaScript等上下文中被安全渲染。这些防护措施

weixin_34248023的博客 470

《PHP 5.x到8.x全量升级工程:兼容性评估、平滑迁移与性能收益的完整实践》

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> div /*核心:这些都是以div正中心开始旋转的.仔细看看文字,记住每一个文字开始都是在左上角为0deg。 你可以理解四个角是0deg 90deg 180deg 270deg,注意一下原点

qq_37805832的博客 855

Laravel 中 scope 查询作用域

Laravel中使用scope作用域...

wgchen 1894

laravel中的模型scope是干什么的?使用场景是什么?底层原理是什么?

模型范围(Scopes)本质上是定义在模型类中的方法,这些方法返回查询构建器的实例。通过这些方法,你可以封装常用的查询逻辑,使得在多个地方需要相同查询逻辑时能够复用。// 查询最近发布的文章// 查询某个分类的文章范围方法是在模型类中定义的方法,这些方法通常以scope开头,后面跟着范围的名称。范围方法返回一个查询构建器的实例,这样就可以继续链式调用其他查询方法。模型范围是 Laravel 中用于封装和重用数据库查询逻辑的一种机制。

长风破浪会有时的博客 472

laravel为Model设置全局作用域

laravel设置全局作用域(GlobalScope)

1539

【Laravel】为Eloquent 模型设置全局作用域和局部作用域进行查询

全局作用域 所谓「全局作用域」,指的是预置过滤器在注册该「全局作用域」的模型类的所有查询中生效,不需要指定任何额外条件。 以User模型类为例,我们在系统中可能只想针对已经验证过邮箱的用户进行操作,在没有介绍「作用域」之前,可能你会在应用中到处编写这样的代码: $users = User::whereNotNull('email_verified_at')->... 通过...

weixin_33736649的博客 416

【127.1】Laravel 模型的 scope 普通用法和全局用法

在项目中 经常会面对一些条件的查询,这些查询条件好些是相同的。scope 可以实现这些相同条件的复用. 普通 scope 定义,函数名称为 scope + 首字母大写 Active (这个名称随意) public function scopeActive($query) { return $query->where('active',1); } 使用,正常使用,其中调用去掉 scope 后,首字母小写的那个函数。scopeActive () 调用 active ()。 $user = \Ap

米洛口的博客 628

laravel实现Model的setAttribute、getAttribute、scopeQuery方法

首先要定义一个Model 1.getAttribute的实现 请getFooAttribute在模型上创建一个方法,其中Foo包含您要访问的列的“studly”外壳名称。在这个例子中,我们将为first_name属性定义一个访问器。尝试检索sex属性值时,Eloquent会自动调用访问者: <?php namespace App; use Illuminate\Database\El...

WXiangQian 1万+

laravel 中scope 应用

在模型中定义 protected static function boot() { Model::boot(); static::addGlobalScope('defaultOrder', function (Builder $builder) { $builder->orderBy('id', 'desc'); }); static::addGlobalScope...

weixin_30722589的博客 469

Laravel 模型使用scope前缀的方法

Laravel中模型中可以定义scope开头方法,这类方法可以模型直接使用。这类方法也称作查询作用域 例子: 现有Post模型,内部定义一个scopeTitle()方法 public function scopeTitle($query, $title="") { return $query-&gt;where('title', $title); } 第一个参数...

记录编程生活 1821
上一篇: 【PHP性能优化秘籍】:利用str_replace数组实现毫秒级文本替换
下一篇: 【PHP框架开发高手必修课】:CodeIgniter 4构造函数注入与依赖管理实战
IterStream
博客等级 码龄1年 152粉丝 2112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值