如何在Laravel Eloquent中实现多层模型关联查询
实现方案
你可以直接用Laravel的关联查询whereHas一步筛选出符合要求的Participant,这种写法效率最高,也能自动避免重复数据问题:
// 替换为你要指定的Sponsor ID $targetSponsorId = 1; // 同时满足两个筛选条件:1. 今日创建 2. 存在属于目标Sponsor的Optin记录 $participants = Participant::createdToday() ->whereHas('optins', function ($query) use ($targetSponsorId) { $query->where('sponsor_id', $targetSponsorId); }) ->get(); // 遍历发送通知即可,自动去重不会重复发送 foreach ($participants as $participant) { // 你的发邮件/通知逻辑,示例:Notification::send($participant, new OptinNotice()); echo $participant->id . PHP_EOL; }
如果你确实需要从Sponsor对象出发查询,记得预加载关联避免N+1查询问题,同时手动去重(同一个Participant可能对同一个Sponsor产生多条Optin记录):
// 预加载Optin关联的Participant数据,避免循环内重复查库 $sponsor = Sponsor::with('optins.participant')->find(1); $participants = collect(); foreach ($sponsor->optins as $optin) { // 过滤空关联、非今日创建的用户,同时做去重 if ( $optin->participant && $optin->participant->created_at->isToday() && !$participants->contains('id', $optin->participant->id) ) { $participants->push($optin->participant); } } // 遍历$participants发送通知即可
内容的提问来源于stack exchange,提问作者The Stompiest
相关产品推荐
相关产品推荐

