Как заменить отношение hasMany () на Laravel API Resources для Lumen - PullRequest
0 голосов
/ 27 декабря 2018

Я перевожу приложение Laravel 5.7 в Lumen и одновременно представляю Ресурсы Laravel API

В моей старой кодовой базе у меня было:

$tournaments = Auth::user()->tournaments();

С

public function tournaments()
{
    return $this->hasMany('App\Tournament');
}

Но теперь, в Lumen, я использую Ресурсы API, поэтому не знаю, как получить тот же результат, но со всеми украшенными дополнительными полями, которые предоставляют ресурс API.

У меня есть:

class TournamentResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'user' => User::findOrFail(Auth::user()->id)->email,
            'championships' => ChampionshipResource::collection($this->whenLoaded('championships')),
            'competitors_count' => $this->competitors->count()
        ];
    }
}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Если вы мигрируете из Laravel в Lumen первым делом, вам нужно убедиться, что вы включили eloquent в файле app / bootstrap.php .

Пожалуйста, следуйте этомуруководство , чтобы убедиться, что вы следуете тому же.Приведенный выше код должен работать после выполнения этих правил.

0 голосов
/ 27 декабря 2018

Ресурсы API просто форматируют способ возврата данных.Это не влияет на ваши отношения.Единственное, что вам нужно сделать, это передать объект / коллекцию (в зависимости от случая) в класс ресурсов API.

Коллекции ресурсов

Если вы возвращаете коллекцию ресурсовили постраничный ответ, вы можете использовать метод collection при создании экземпляра ресурса в вашем маршруте или контроллере:

use App\User;
use App\Http\Resources\User as UserResource;

Route::get('/user', function () {
    return UserResource::collection(User::all());
});

Как видите, просто используйте его:

TournamentsController.php

use App\Http\Resources\TournamentResource;

//

    public function index()
    {
        $tournaments = auth()->user()->tournaments;

        return TournamentResource::collection($tournaments);
    }

Проверьте документацию относительно этого аспекта.Кроме того, чтобы загрузить дочерние элементы (championship), вы можете Eager Load / Lazy Eager Load отношения элементов.


Наблюдение:

В отношениях, когда вы используете его как метод (auth()->user()->tournaments()), вы получаете доступ к самой связи, полезно, если вы хотите продолжать ограничивать отношения.Когда вы используете его в качестве атрибута (auth()->user->tournaments), вы получаете доступ к результатам запроса.

Проверьте этот ответ для лучшего объяснения.

...