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

Laravel定时任务中嵌套关联无法获取default_item_name数据的问题

问题:定时任务中无法获取关联数据default_item_name

执行php artisan schedule:run定时任务时,查询EnquiryMenu模型的default_item_name关联数据为空,核心原因是event_id未从CronController传递到MenuCategory模型的关联方法中——定时任务无HTTP请求上下文,无法通过request()->get('event_id')获取参数,导致关联查询的where条件失效。


相关代码

CronController

public function sendFoodMenuPdfEmailOrTelegram()
{
     foreach ($getEnquiryEvents as $key => $value) {
          $FoodPackageMenu = EnquiryMenu::with(['foodPackage', 'menu_category_without_item.default_item_name'])
        ->where('food_package_id', $food_template_id)
            ->where('enquiry_id', $enquiry_id)
            ->whereNull('deleted_at')
            ->where('event_id', $event_id)
            ->groupBy('menu_category_id')
            ->orderBy('id', "ASC")
            ->get()
            ->toArray();
    }
}

EnquiryMenu Model

public function menu_category_without_item()
{
    return  $this->hasOne(MenuCategory::class,'id','menu_category_id');
}
public function default_item_name($eventid = null)
{
    $eventid = $eventid ?? request()->get('event_id');
    return $this->hasMany(EnquiryMenu::class, 'menu_category_id', 'id')
            ->select('snc_menu_items.*',
                \DB::raw("IF(snc_enquiry_menus.item_id = '0',snc_enquiry_menus.menu_category_id, snc_enquiry_menus.menu_category_id) as menu_category_id", ""), 
                'snc_enquiry_menus.extra_menu','snc_enquiry_menus.extra_charge','snc_enquiry_menus.extra_charge_amount','snc_enquiry_menus.service_time','snc_enquiry_menus.food_service_time','snc_enquiry_menus.menu_status','snc_enquiry_menus.is_complimentory','snc_enquiry_menus.is_complimentory', \DB::raw('IFNULL(snc_enquiry_menus.notes, "") as notes'),\DB::raw('IFNULL(snc_enquiry_menus.description, "") as description'))
            ->leftJoin('snc_menu_items','snc_menu_items.id', '=','snc_enquiry_menus.item_id')
            ->where('snc_enquiry_menus.event_id', $eventid)
            ->whereNull('snc_enquiry_menus.deleted_at');
}

尝试过的无效代码

$FoodPackageMenu = EnquiryMenu::with([
    'foodPackage', 
    'menu_category_without_item' => function($q) use ($event_id) {
        $q->with([
            'default_item_name' => function($qe) use ($event_id) {
                $qe->yourFunctionName($arg1, $event_id);
            }
        ]);
    }
]);

可行解决方案

方案1:嵌套预加载时手动传递参数到关联方法

带参数的关联方法无法直接通过.链式预加载,需在闭包中手动调用关联方法并传入event_id:

$FoodPackageMenu = EnquiryMenu::with(['foodPackage', 'menu_category_without_item' => function($query) use ($event_id) {
    // 手动加载default_item_name关联并传入event_id
    $query->with(['default_item_name' => function($subQuery) use ($event_id) {
        return $subQuery->default_item_name($event_id);
    }]);
}])
->where('food_package_id', $food_template_id)
->where('enquiry_id', $enquiry_id)
->whereNull('deleted_at')
->where('event_id', $event_id)
->groupBy('menu_category_id')
->orderBy('id', "ASC")
->get()
->toArray();

方案2:优化关联方法,移除请求依赖

考虑到定时任务无HTTP上下文,建议修改MenuCategory的关联方法,强制要求外部传入event_id,避免依赖request():

// MenuCategory Model 修改后的关联方法
public function default_item_name($eventid)
{
    // 不再依赖request(),强制外部传入参数
    return $this->hasMany(EnquiryMenu::class, 'menu_category_id', 'id')
            ->select('snc_menu_items.*',
                \DB::raw("IF(snc_enquiry_menus.item_id = '0',snc_enquiry_menus.menu_category_id, snc_enquiry_menus.menu_category_id) as menu_category_id", ""), 
                'snc_enquiry_menus.extra_menu','snc_enquiry_menus.extra_charge','snc_enquiry_menus.extra_charge_amount','snc_enquiry_menus.service_time','snc_enquiry_menus.food_service_time','snc_enquiry_menus.menu_status','snc_enquiry_menus.is_complimentory','snc_enquiry_menus.is_complimentory', \DB::raw('IFNULL(snc_enquiry_menus.notes, "") as notes'),\DB::raw('IFNULL(snc_enquiry_menus.description, "") as description'))
            ->leftJoin('snc_menu_items','snc_menu_items.id', '=','snc_enquiry_menus.item_id')
            ->where('snc_enquiry_menus.event_id', $eventid)
            ->whereNull('snc_enquiry_menus.deleted_at');
}

修改后按方案1的方式调用即可,确保在HTTP请求和定时任务环境下都能正常获取关联数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:26:04