Получить связь в сводной таблице и вручную создать специальный ресурс API - PullRequest
0 голосов
/ 09 апреля 2019

Не могу найти лучшее название для этого вопроса, не стесняйтесь поправлять меня.

У меня есть следующие объекты:

  • Памятка
  • Иностранный гражданин
  • Пересмотр иностранных граждан

Вот как они связаны друг с другом:

enter image description here

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

Для этого я создал специальную таблицу ревизий, и каждый раз, когда я изменяю иностранного гражданина, я фактически создаю новую ревизию.

Раньше у меня не было этой таблицы.

Кроме того, у меня есть Ресурсы API для преобразования API, чтобы он хорошо подходил для веб-приложения.Ранее API вернул памятку, содержащую коллекцию иностранных граждан.Для каждого объекта (памятка, иностранный гражданин, редакция иностранного гражданина) у меня есть класс ресурсов.

Сейчас мне нужно вернуть список иностранных граждан следующим образом :

{[
  id: 5 // foreign citizen id,
  revision_id: 10 // foreign citizen revision id
  name: 'John'
], ...}

Это своего рода объединение:

[
  id:
  revision_id: 10
]

и данных о пересмотре иностранного гражданина.

Я мог бы вернуть записку с иностранными гражданами, и для каждого гражданина я быесть подмножество под названием ревизии, но Web не нуждается в этом, и изменение логики javascript не займет много времени.

Однако, когда мне нужен список ревизий (например, если я добавляюстраница, на которой я могу видеть все ревизии), тогда у меня будет только обычный массив ревизий, который создается ресурсом ревизий иностранного гражданина.

Вот что я закончил:

class ForeignCitizenResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        $data = [
            'id' => $this->id,
        ];


        // This looks like a code smell, but I couldn't figure out anything better    
        if ($this->pivot && $this->pivot->foreign_citizen_revision_id) {
            $revision = new ForeignCitizenRevisionResource(
                $this->revisions->firstWhere('id', $this->pivot->foreign_citizen_revision_id)
            );

            // How to add all revision attributes to $data?
            // Exactly those attributes which are returned from ForeignCitizenRevisionResource
            // as if I used it in a controller
        }


        return $data;
    }
}

Я не уверен, что весь метод верен, но я почти уверен, что веб-сторона должна принимать иностранного гражданина, поскольку это обычный иностранный гражданин с идентификатором ревизииДо того, как у меня была таблица редакций, я получил все атрибуты иностранных граждан, кроме идентификатора редакции.

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

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