Как JSON сериализовать коллекцию отношений в Laravel - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь получить коллекцию members через мое модельное агентство (hasMany()).

members связано с отношениями Agency через hasMany(), и я извлекаю их так:

$members = $this->model->where("id", $agencyId)->firstOrFail()->members();

В моем классе модели Member. php я реализую JSONSerializable с помощью следующего метода:

public function jsonSerialize()
    {
        $agency = $this->agency()->first();

        return [
            'member_id' => $this->member_id,
            'name' => $this->name(),
            'surname' => $this->surname(),
            'email' => $this->email(),
            'active' => $this->active,
            'agency' => [
                'id' => $agency->id,
                'name' => $agency->name,
            ]
        ];
    }

Однако эта сериализация никогда не выполняется вызывается, когда я пытаюсь получить членов следующим образом:

$members = $this->model->where("id", $agencyId)->firstOrFail()->members();

return $members->paginate(
    $pageSize,
    ['*'],
    'page',
    $pageNumber
);

Ответ:

 "current_page": 1,
  "data": [
    {
      "member_id": "0315c19f-8f5c-467a-97fd-a0422f5e14a5",
      "user_id": "77b36a51-4b86-34be-9a76-856ca68c3a1e",
      "agency_id": "d8c0cfab-686c-3b40-90ea-8bf52f07a3a0",
      "active": true,
      "deleted_at": null,
      "created_at": "2020-04-30 15:20:38",
      "updated_at": "2020-04-30 15:20:38"
    },
    {
      "member_id": "f522914d-17cd-470d-a5d6-365930958a29",
      "user_id": "994ca229-554e-3ae9-8459-24dc1479d75c",
      "agency_id": "d8c0cfab-686c-3b40-90ea-8bf52f07a3a0",
      "active": true,
      "deleted_at": null,
      "created_at": "2020-04-30 15:20:38",
      "updated_at": "2020-04-30 15:20:38"
    }
  ],
  "first_page_url": "\/agency\/d8c0cfab-686c-3b40-90ea-8bf52f07a3a0\/members?page=1",
  "from": 1,
  "last_page": 1,
  "last_page_url": "\/agency\/d8c0cfab-686c-3b40-90ea-8bf52f07a3a0\/members?page=1",
  "next_page_url": null,
  "path": "\/agency\/d8c0cfab-686c-3b40-90ea-8bf52f07a3a0\/members",
  "per_page": 50,
  "prev_page_url": null,
  "to": 2,
  "total": 2
}

Почему метки времени и т. c. показано в данных участника? Почему не используется метод jsonSerialize?

1 Ответ

0 голосов
/ 02 мая 2020

Я думаю, Laravel использует функцию toArray() для сериализации JSON. Вы должны заглянуть в Ресурсы, если вы действительно хотите контролировать вывод вашего JSON.

https://laravel.com/docs/7.x/eloquent-resources

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