Laravel:如何编写路由来获取 hasMany 关系?

问题描述 投票:0回答:1

在 Laravel 中,我有这些模型来描述人们参与活动的一天事件。 每个事件有多个活动,但一个活动只属于一个事件。 我无法编写一条路线来获取给定事件的活动。

模特活动

<?php
namespace App\Models;
use App\Models\Activity;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Event extends Model
{
    use HasFactory;
    protected $table = 'events';
    protected $fillable = [
        'label',
        'date',
        'activities',
        'cassetteOperations',
        'bankOperations'
    ];

    /**
     * Get all of the event's activities.
    */
    public function activities(): HasMany
    {
        return $this->hasMany(Activity::class);
    }
}

模特活动

<?php
namespace App\Models;
use App\Models\Participation;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;

class Activity extends Model
{
    use HasFactory;
    protected $fillable = [
        'label',
        'event_id',
        'memberPrice',
        'otherPrice',
        'memberEntryFee',
        'otherEntryFee',
        'type',
        'participations'
    ];

    /**
     * Get the participations for the activity
     */
    public function participations(): HasMany
    {
        return $this->hasMany(Participation::class);
    }

    /**
     * Get the event associated with the activity
     */
    public function event(): HasOne
    {
        return $this->hasOne(Event::class);
    }

    /**
     * Get the persons that participates to this activity
     *
     */
    public function participants(): HasManyThrough
    {
        return $this->hasManyThrough(Person::class, Participation::class);
    }
}

App/Http/Api/ActivityController 我有

<?php
namespace App\Http\Controllers\Api;

use App\Models\Event;
use App\Models\Activity;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Resources\ActivityResource;
use App\Http\Requests\StoreActivityRequest;

class ActivityController extends Controller
{
    public function index($event_id)
    {
        return ActivityResource::collection(Activity::where('event_id', $event_id)->orderBy('id')->get());

    }

    public function store(StoreActivityRequest $request)
    {
        Activity::create($request->validated());
        //return only activities bound to the event
        return ActivityResource::collection(Activity::where('event_id', $request->event_id)->orderBy('id')->get());
    }

}

routes/api我有

Route::middleware(['auth:sanctum'])->get('/user', function (Request $request) {
    return $request->user();
});
Route::apiResource('person',PersonController::class)->middleware(['auth'])->middleware('App\Http\Middleware\Allowed');
Route::apiResource('event',EventController::class)->middleware(['auth'])->middleware('App\Http\Middleware\Allowed');

Route::get('activity/{event_id}',[ActivityController::class,'index'])->middleware(['auth'])->middleware('');
Route::apiResource('activity',ActivityController::class)->middleware(['auth'])->middleware('App\Http\Middleware\Allowed');

在我的 vue 项目中,我的目标如下

async apiFetchEventActivities(event_id) {
    try {
        await axios.get('sanctum/csrf-cookie')
        this.activityErrors = []
        const { data } = await axios.get('/api/activity/' + event_id)
        this.activities = data.data

    } catch ({ response }) {
        this.activityErrors = [response.data.message, response.status]
        return ('failure')
    }
}

我收到错误状态 500,其中包含“消息”:“目标类 [] 不存在。”,

我的路线(routes/api 中最后一条路线)是否不正确,为什么? 应该怎么写呢?

routes laravel-10
1个回答
0
投票

错误消息“目标类 [] 不存在”通常意味着 Laravel 找不到您要使用的类。在您的情况下,路由定义中的中间件似乎是空的,这可能会导致问题。

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

您应该删除空的中间件:

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

此外,请确保

ActivityController
已正确导入到路线文件的顶部。如果不是,请在您的
routes/api.php
文件顶部添加此行:

use App\Http\Controllers\Api\ActivityController;

最后,确保您的

ActivityController
命名空间正确并且文件位于正确的目录中。根据您的代码,它应该位于
app/Http/Controllers/Api/ActivityController.php

© www.soinside.com 2019 - 2024. All rights reserved.