Как включить дополнительные данные в ответ API при аутентификации пользователя - PullRequest
1 голос
/ 17 апреля 2019

Я создаю проект, где пользователи могут учиться с помощью флэш-карт.У меня есть API, из которого пользователи могут получать колоды карт.Пользователи, не прошедшие проверку подлинности, могут получать колоды, но их результаты обучения не сохраняются в базе данных.

Я хотел бы, чтобы прошедший проверку пользователь получал дополнительные данные в ответ при извлечении флэш-карт из API.Более конкретно, каждая карта должна иметь дополнительное поле 'study_at', содержащее дату, когда они должны изучить эту карту в следующий раз.

Дата 'study_at' хранится в сводной таблице с именем 'card_user'.

Я пытался изменить метод toArray () в модели Card, но я не знаю, был ли это путь.

Это конечная точка API:

Route::get('/decks', 'DecksController@index');

DecksController

class DecksController extends Controller
{
    public function index()
    {
        $decks = Deck::all();

        return new DeckCollection($decks);
    }

DeckCollection

class DeckCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

DeckResource

class DeckResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'cards' => new CardCollection($this->cards),
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

CardCollection

class CardCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return parent::toArray($request);
    }
}

CardResource

Здесь я хочу включить дату 'study_at'

class CardResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'front' => $this->front,
            'back' => $this->back,
            // Include 'study_at' date here
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

Это ответ, который я хотел бы получить для аутентифицированного пользователя:

{
    "id": 1,
    "name": "Coffee Break French",
    "cards": [
        {
            "id": 1,
            "front": "Good morning",
            "back": "Bonjour",
            "study_at": "2019-05-26T15:00:00.000000Z"
            "created_at": "2019-04-14T21:04:05.000000Z",
            "updated_at": "2019-04-14T21:04:05.000000Z"
        },
        {
            "id": 2,
            "front": "Good afternoon",
            "back": "Bonne après-midi",
            "study_at": "2019-05-26T15:00:00.000000Z"
            "created_at": "2019-04-14T21:04:21.000000Z",
            "updated_at": "2019-04-14T21:04:21.000000Z"
        },
        {
            "id": 3,
            "front": "My name is John",
            "back": "Je m'appelle John",
            "study_at": "2019-05-26T15:00:00.000000Z"
            "created_at": "2019-04-14T21:04:37.000000Z",
            "updated_at": "2019-04-14T21:04:37.000000Z"
        }
    ],
    "created_at": "2019-04-14T21:03:38.000000Z",
    "updated_at": "2019-04-14T21:03:38.000000Z"
}

Ответы [ 2 ]

4 голосов
/ 17 апреля 2019

Чтобы включить атрибут только при определенных условиях, вы должны использовать условные атрибуты :

class CardResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'front' => $this->front,
            'back' => $this->back,
            // Include 'study_at' date here
            'study_at' => $this->when(auth()->user(), $this->study_at), // Retrieve your value through eloquent relation
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}
0 голосов
/ 17 апреля 2019

Вы можете определить отношения с Laravel Eloquent:

class Card extends Model
{
   public function userCard() {
     // your relationship
   }
}
class CardResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'front' => $this->front,
            'back' => $this->back,
            'study_at' => $this->userCard,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
}

См .: https://laravel.com/docs/5.8/eloquent-relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...