You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Laravel集合的forget()方法无法移除其中的指定对象?

问题原因

forget()方法是按集合自身的键名删除元素,而非按集合元素内的字段值匹配删除。
你通过random()方法得到的$selected_tickets集合,默认保留原集合的数字索引/使用连续数字索引,和集合内Ticket模型的id字段没有对应关系,你传入模型id调用forget()时找不到对应键,自然不会删除任何元素。

可行解决方案

以下三种方案都可以实现需求:

方案1:以id为键重建集合索引后删除

先调用keyBy('id')把集合的键设置为对应Ticket的id,之后就可以直接用id调用forget()删除:

$tickets = Tickets::all();
$total_winners = 5;
// 重建索引,用Ticket的id作为集合的键
$selected_tickets = $tickets->random($total_winners)->keyBy('id');
$jackpot_winner = $selected_tickets->random();
$selected_tickets->forget($jackpot_winner->id);

方案2:过滤生成新集合

直接用filter()筛选掉头奖票,得到剩余的票集合:

$tickets = Tickets::all();
$total_winners = 5;
$selected_tickets = $tickets->random($total_winners);
$jackpot_winner = $selected_tickets->random();
// 过滤掉头奖票,得到新的剩余票集合
$remaining_tickets = $selected_tickets->filter(fn($ticket) => $ticket->id !== $jackpot_winner->id);

方案3:查找元素对应索引后删除

先重置集合为连续数字索引,搜索到头奖票的索引位置后再删除:

$tickets = Tickets::all();
$total_winners = 5;
// 重置为从0开始的连续数字索引
$selected_tickets = $tickets->random($total_winners)->values();
$jackpot_winner = $selected_tickets->random();
// 查找头奖票在集合中的索引
$jackpot_index = $selected_tickets->search(fn($ticket) => $ticket->id == $jackpot_winner->id);
if ($jackpot_index !== false) {
    $selected_tickets->forget($jackpot_index);
}

内容的提问来源于stack exchange,提问作者InvalidSyntax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:36:03