为什么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
相关产品推荐
相关产品推荐

