Laravel 集合原生不提供非变异的 put() 方法,但可通过 clone 实现等效效果:克隆原集合后调用 put(),确保原始集合不变,新集合包含新增键值对。
laravel 集合原生不提供非变异的 `put()` 方法,但可通过 `clone` 实现等效效果:克隆原集合后调用 `put()`,确保原始集合不变,新集合包含新增键值对。
在 Laravel 开发中,Collection::put($key, $value) 是一个变异(mutating)方法——它直接修改原集合并返回自身。当你需要保留原始集合不变、仅生成一个新增键值对的新集合时,Laravel 并未内置类似 putNonMutating() 或 withPut() 的官方方法(查阅 Laravel 8.x 官方文档 — Collections 方法列表 可确认无此方法)。
不过,借助 PHP 原生的 clone 关键字,即可优雅、高效地达成目标:
$collection = collect(['key' => 'value']);$new = (clone $collection)->put('another', 'pair');$collection->all(); // ['key' => 'value']$new->all(); // ['key' => 'value', 'another' => 'pair']
✅ 该方案简洁、语义清晰,且性能优于 merge()(尤其在单键插入场景下):merge() 会遍历传入数组并执行键合并逻辑,而 clone + put 仅做一次浅拷贝与单次赋值。
⚠️ 注意事项:
? 替代思路参考:
虽然 merge(['another' => 'pair']) 能达到相同结果,但它本质是「合并逻辑」,语义上不如 clone + put 精准表达「添加单个键值对」的意图;且当键存在时,merge() 会覆盖,而 put() 同样覆盖——二者行为一致,但前者开销略高。
总结:(clone $collection)->put(...) 是实现非变异 put 行为最直接、推荐的标准实践,兼顾可读性、性能与 Laravel 生态兼容性。