Laravel v12.54.0 新增
Model::withoutRelation()
为了选择性地从克隆的模型实例中卸载关系,引入了
interval()
在
InteractsWithData
用于解析持续时间输入,并包含作业表上的复合索引,以提高队列轮询性能。
主要亮点包括:
Model::withoutRelation()选择性地卸载已加载的关系,而不改变原始关系。interval()方法InteractsWithData用于将请求数据转换为CarbonInterval- HTTP客户端中包含的请求上下文(方法、URL、状态)
Response::dump()输出 BinaryFileResponseHTTP 测试中的断言支持queue:monitor在标准输出中显示最旧的待处理作业- 用于邮件 Markdown 渲染的自定义 CommonMark 扩展
- 作业表上的队列轮询性能复合索引
- PostgreSQL
tsvector模式构建器中的列类型
什么是新的
Model::withoutRelation()
Model::withoutRelation()
创建一个克隆模型实例,移除特定关系,但不改变原始模型。这填补了两者之间的空白。
withoutRelations()
——这会消除所有关系——以及
unsetRelation()
这会直接改变模型。
// 从克隆中移除单个关系轻量级
=
$post
->
无关系
(
'评论'
(英文):// 删除多重关系轻量级
=
$post
->
无关系
([
'评论'
,
标签
]);// 原文未经修改$post
->
关系已加载
(
'评论'
(英文):
// 真的
这对于处理循环引用、减少排队作业中的有效负载大小以及准备序列化模型而不剥离所有预加载数据非常有用。
拉取请求: #59137
interval()
在
InteractsWithData
新的
interval()
方法
InteractsWithData
将请求输入转换为
CarbonInterval
例如,它可以直接接受 ISO 8601 持续时间字符串,也可以接受与单位配对的数值。
// ISO 8601 持续时间字符串(“P1DT2H” → 1 天 2 小时)$请求
->
间隔
(
'期间'
(英文):// 带字符串单位的数值$请求
->
间隔
(
'暂停'
,
'第二'
(英文):
// “90” → 90 秒$请求
->
间隔
(
'冷却'
,
'天'
(英文):
// “7” → 7 天// 或者使用 Carbon\Unit 枚举$请求
->
间隔
(
'延迟'
,
单元
::
分钟
(英文):
这与
date()
作为请求数据中与时间相关的辅助函数,为表单提供了一种处理持续时间输入的原生方法。
拉取请求: #59114
请求上下文
Response::dump()
Response::dump()
现在,HTTP 客户端的输出除了响应体之外,还包含了请求方法、URL 和响应状态码。此前,输出仅显示响应体,因此在多次调用后很难确定哪个请求产生了特定的响应。
// 前{"error": {"message": "无效卡"}}// 后"POST https://api.stripe.com/v1/charges" 422{"error": {"message": "无效卡"}}
拉取请求: #59136
BinaryFileResponse
论断支持
测试响应返回
response()->file()
和
response()->download()
现在支持流式内容断言。以前,调用
assertStreamedContent()
在
BinaryFileResponse
会失败,因为测试响应无法读取底层文件。
$this
->
得到
(
'/download/report.pdf'
)
->
断言Ok
()
->
断言流内容
(
file_get_contents
(
'report.pdf'
));
拉取请求: #59018
queue:monitor
显示最早的待处理任务
这
queue:monitor
现在,该命令会在其标准文本输出中显示最旧的待处理作业的等待时间。此前,此信息仅在 JSON 输出中提供,因此您必须解析 JSON 或直接检查队列驱动程序才能发现过期作业。
待处理任务...................................... 3延误的工作...................................... 0预留职位..................................... 1最旧的待处理任务................................ 2分钟前
拉取请求: #59073
邮件自定义 Markdown 扩展
邮件 Markdown 渲染现在支持通过以下方式自定义 CommonMark 扩展:
mail.markdown.extensions
配置密钥。此前,仅加载了核心和表格扩展。
// config/mail.php'markdown'
=>
[
“扩展”
=>
[
League\CommonMark\Extension\Strikethrough\StrikethroughExtension
::班级
,
League\CommonMark\Extension\TaskList\TaskListExtension
::班级
,],],
任何实现 CommonMark 的扩展
ExtensionInterface
您可以在这里注册。
拉取请求: #59051
就业综合指数表
作业表迁移现在会在作业表上创建一个复合索引。
(queue, reserved_at, available_at)
而不是使用单列索引
queue
在队列繁忙的情况下,之前的单列索引导致数据库需要扫描行才能进行筛选。
reserved_at
和
available_at
每次轮询都会执行此操作。新的复合索引与队列轮询查询的实际结构一致,该查询会对所有三列进行筛选。
这是一项新的迁移操作,仅适用于全新安装的应用程序或重新运行迁移的应用程序。现有应用程序如果需要改进,则应手动添加复合索引。
拉取请求: #59111
PostgreSQL
tsvector
列类型
模式构建器现在支持
tsvector
PostgreSQL 的列类型,无需在定义全文搜索列时编写原始 SQL。
架构
::
桌子
(
‘文章’
,
功能
(
蓝图
$table) {$表
->
ts向量
(
'搜索向量'
)
->
可空
()
->
存储为
(
"setweight(to_tsvector('english', coalesce(title, '')), 'A') || "
。
"setweight(to_tsvector('english', coalesce(body, '')), 'B')"(英文):});
拉取请求: #59004
错误修复和性能改进
队列和作业:
数据库:
HTTP 和文件系统:
- 修复 Punycode 子域名的 URL 验证( #58982 )
- 抑制 chmod 错误
Filesystem::replace()在非POSIX文件系统上( #59126 ) - 修复外观缓存文件权限( #59059 )
控制台和视图:
- 去重路径
view:cache( #59145 ) - 使固定
TwoColumnDetail从第二列值中删除尾随标点符号( #59010 ) - 允许
app.editor.base_path为空字符串( #58991 )
其他:
- 修复 Redis 限流忽略问题
after回调( #58990 ) - 修复提交后观察者故障
-ing活动取消( #59058 ) - 修复数组偏移量弃用警告( #59019 )
- 更新 CommonMark 版本约束以解决
DisallowedRawHtmlRenderer安全问题( #59131 )





