Laravel возврат имеет много отношений - PullRequest
0 голосов
/ 03 марта 2020

Это пользователь, который может иметь много событий, с которыми он связан.

Я хочу иметь возможность вызывать API, чтобы получить все события, связанные с пользователем. Я изменил свой первичный ключ с id на uuid. Я также связал внешний ключ с таблицей событий. Первичным ключом в таблице событий также является столбец с именем UUID.

Я получаю сообщение об ошибке

Return value of App\Http\Controllers\UsersController::getAllEvents() must be an instance of App\Http\Resources\UserResource, instance of Illuminate\Database\Eloquent\Relations\HasMany returned

Моя таблица маршрутов:

Route::apiResource('/users', 'UsersController');
Route::apiResource('/events', 'EventsController');
Route::get('/users/allevents/{user}', 'UsersController@getAllEvents');

Итак, URL, по которому я перехожу:

http://127.0.0.1:8000/api/users/allevents/0a0jqZ7qzuhemKnzB3wOPUc2Ugp2

0a0jqZ7qzuhemKnzB3wOPUc2Ugp2 - это UUID пользователя. Я хочу получить все события, связанные с этим пользователем.

Моя модель пользователя:

class User extends Model
{
    use Notifiable;
    use SoftDeletes;

    protected $dates = ['deleted_at'];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'uuid', 'email', 'firstName', 'lastName', 'level', 'venmo'
    ];

    public function getRouteKeyName()
    {
        return 'uuid';
    }

    public function events() {
        return $this->hasMany(Event::class);
    }


}

Моя модель события:

class Event extends Model
{
    use SoftDeletes;
    protected $table = 'events';
    protected $dates = ['deleted_at'];
//    public function getRouteKeyName()
//    {
//        return 'uuid';
//    }

    protected $fillable = [
        'id', 'availableSpots', 'uuid', 'chosenDate', 'date', 'epochTime', 'level', 'price', 'time', 'created_at', 'updated_at', 'user_uuid'
    ];
    public $incrementing = false;
    protected $primaryKey = 'uuid';
    protected $keyType = 'string';


    public function user(){
        return $this->belongsTo(User::class, 'user_uuid', 'uuid');
    }
}

Мой UsersController:

class UsersController extends Controller
{

    public function show(User $user): UserResource
    {

        return new UserResource($user);
    }



    /**
     * @param Request $request
     * @param User $user
     * @return UserResource
     */
    public function update(Request $request, User $user): UserResource
    {
        $user->update($request->all());


        return new UserResource($user);

    }


    /**
     * @param User $user
     * @return UserResource
     * @throws \Exception
     */
    public function destroy(User $user): UserResource
    {
        $user->delete();

        return new UserResource($user);
    }

    public function getAllEvents(User $user): UserResource {
        return $user->events();
    }
}

Ответы [ 2 ]

1 голос
/ 03 марта 2020
public function getAllEvents(User $user)
{
    return $user->events;
}
1 голос
/ 03 марта 2020

Вы используете неправильный тип метода return, он не возвращает UserResource, он возвращает массив событий, поэтому при удалении неправильного типа он будет работать

   public function getAllEvents(User $user) {
        return $user->events;
    }
...