Как написать в Active Record связь и получение связанных данных из API?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
sergey-o90
Сообщения: 11
Зарегистрирован: 2021.05.28, 21:06

Как написать в Active Record связь и получение связанных данных из API?

Сообщение sergey-o90 »

У меня есть REST API.
Есть три сущности Entity1, Entity2, Entity3. На каждую сущность привязана Active Record и соответствено таблица из БД.
Связь Entity1 и Entity2 1:1, связь Entity2 и Entity3 - 1:N.
В моделях прописаны и extraFields() и геттеры, которые возвращают ActiveQuery. В общем, по стандарту в yii2. В итоге если делать запрос вида:

Код: Выделить всё

/entity1?expand=entity2.entity3
то получу данные с вложенностями как и полагается:

Код: Выделить всё

{
	"...": ...,
	"...": ...,
	"entity2": {
		"...": ...,
		"...": ...,
		"entity3": [
			{"...": ...,},
			{"...": ...,},
			{"...": ...,},
		]
	}
}
Всё работает отлично. НО. Теперь entity2 и entity3 планируют располагать где-то вовне, на отдельном сервере, сервисе и от них данные будут прилетать через REST API.

Вопрос: как это можно всё безболезненно организовать так, чтобы у меня осталась возможность получать связанные данные в запросе вот так: /entity1?expand=entity2 и /entity1?expand=entity2.entity3 и чтобы особо не пришлось что-то переделывать в ActiveRecord модели(ях)? Я думал, что entity2 и entity3 переделаю из AR в наследники от Model и что-то незначительное допишу переопределю и всё... Но кажется всё намного сложнее. Подскажите, куда двигаться, как реализовать.

---

P.S. По-тупому я могу реализовать: например в геттере первой модели прописать условие: если в GET запросе есть expand=entity2.entity3, то сделать запрос по API и в геттере добавить entity2 с вложенным entity3, если в запросе просто expand=entity2 - вернуть объект только со вложенным entity2. Но это очень глупо. Хочется чего-то более элегантного
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Как написать в Active Record связь и получение связанных данных из API?

Сообщение SiZE »

В качестве примера можно посмотреть реализацию пакета https://github.com/yiisoft/yii2-elasticsearch. Общение с эластиком происходит по http протоколу. Получаете AR модели, заполненные данными из внешнего источника.
Ответить