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

如何延迟静态created启动方法至模型关联建立完成?

解决模型created事件中关联未建立的问题

一、通过延迟队列执行逻辑

你可以把创建重复事件的逻辑放到延迟队列任务中,让它延迟几秒执行,确保关联的Booking和BookingEvent已经完成创建:

  1. 生成队列任务类:
php artisan make:job GenerateRecurringEvents
  1. 编写任务类逻辑:
namespace App\Jobs;

use App\Models\Enquiry;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class GenerateRecurringEvents implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $enquiry;

    public function __construct(Enquiry $enquiry)
    {
        $this->enquiry = $enquiry;
    }

    public function handle()
    {
        // 重新加载模型,确保关联已同步
        $enquiry = $this->enquiry->fresh();
        
        if ($enquiry->recurring && $enquiry->booking && $enquiry->booking->first_event) {
            $evt = $enquiry->booking->first_event;
            // 此处编写重复事件创建逻辑
        }
    }
}
  1. 在created事件中延迟分发任务:
self::created(function ($enquiry) {         
    if ($enquiry->recurring == true) {               
        // 延迟5秒执行,可根据实际场景调整时长
        GenerateRecurringEvents::dispatch($enquiry)->delay(now()->addSeconds(5));
    }
});

二、无需队列的同步延迟方案

如果不想依赖队列,也可以在事件中循环检查关联状态(不推荐在高并发场景使用,可能影响性能):

self::created(function ($enquiry) {         
    if ($enquiry->recurring == true) {               
        $maxAttempts = 10;
        $attempts = 0;
        
        // 最多等待10秒,每秒检查一次关联是否建立
        while ($attempts < $maxAttempts) {
            $freshEnquiry = $enquiry->fresh();
            if ($freshEnquiry->booking && $freshEnquiry->booking->first_event) {
                $evt = $freshEnquiry->booking->first_event;
                // 执行重复事件创建逻辑
                break;
            }
            sleep(1);
            $attempts++;
        }
    }
});

三、更稳妥的重构思路

其实调整逻辑触发时机是更可靠的方案:

  • 若Booking是在Enquiry创建后立即生成的,可将重复事件逻辑放到Booking的created事件中,或在Booking创建完成后直接调用生成方法
  • 用saved事件替代created,但需额外判断是否为新创建的记录,避免更新时重复执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:51:12