Не могу найти лучшее название для этого вопроса, не стесняйтесь поправлять меня.
У меня есть следующие объекты:
- Памятка
- Иностранный гражданин
- Пересмотр иностранных граждан
Вот как они связаны друг с другом:
ИтакВ каждой записке содержится несколько иностранных граждан.Дело в том, что при изменении иностранного гражданина памятка не должна быть затронута, то есть она должна сохранить старое имя иностранного гражданина.
Для этого я создал специальную таблицу ревизий, и каждый раз, когда я изменяю иностранного гражданина, я фактически создаю новую ревизию.
Раньше у меня не было этой таблицы.
Кроме того, у меня есть Ресурсы 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
, иногда мне нужно получить его атрибуты и объединить их с другими данными.