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

Laravel中编写获取hasMany关联数据的路由报错排查与修正

问题分析与解决方案

路由配置确实存在错误,报错原因如下:

你在路由中重复调用了middleware()方法,并且第二个middleware('')传入了空字符串。Laravel会将这个空字符串当作要加载的中间件类名去解析,自然找不到对应的类,所以抛出“Target class [] does not exist.”的500错误。

另外必须先修正模型关联问题:Activity模型中的event()关联必须改为belongsTo,这是保证关联查询正常的前提:

// app/Models/Activity.php
public function event()
{
    return $this->belongsTo(Event::class);
}

正确的路由编写方式

方式1:修复原有路由的错误

去掉多余的空middleware()调用,将中间件配置合并为一个:

// routes/api.php
Route::get('activity/{event_id}', [ActivityController::class, 'index'])->middleware('auth');

如果后续需要添加多个中间件,可用数组形式传递:

Route::get('activity/{event_id}', [ActivityController::class, 'index'])->middleware(['auth']);

对应的控制器方法可保持原有逻辑,通过event_id查询:

// app/Http/Controllers/ActivityController.php
public function index($event_id)
{
    $activities = Activity::where('event_id', $event_id)->get();
    return ActivityResource::collection($activities);
}

方式2:使用RESTful嵌套路由(推荐,符合Laravel最佳实践)

这种方式语义更清晰,直接体现“某个Event下的Activity列表”的关系,还能利用路由模型绑定简化代码:

// routes/api.php
// 把需要auth中间件的路由统一分组,更整洁
Route::middleware('auth')->group(function () {
    Route::get('events/{event}/activities', [ActivityController::class, 'index']);
});

对应的控制器方法可直接接收Event模型实例,无需手动查询:

// app/Http/Controllers/ActivityController.php
public function index(Event $event)
{
    // 直接通过模型关联获取Activity列表
    return ActivityResource::collection($event->activities);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:04:58