Объединение данных из нескольких источников в Доктрине - PullRequest
0 голосов
/ 15 мая 2019

Я создаю приложение, которое зависит от сторонних данных из REST API и объединяет его с данными из моей собственной базы данных.

У меня есть конечная точка сущности location в API, которую я должен запросить, используя фильтры, определенные API (параметры запроса), и получить список events для данного location из моей базы данных, используя Doctrine.

У меня возникает проблема: если я запрашиваю event и пытаюсь получить его location, мне придется обращаться к третьей стороне за каждым event.

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

Я могу кэшировать сторонние данные, возможно, в базу данных, которая позволила бы мне просто использовать Doctrine как обычно?

Или я должен создать хранилище доктрин, которое не сохраняется в базе данных, если Doctrine это позволяет?

Мне кажется, что ни один из них не является идеальным подходом. Я изучил DoctrineRestDriver , который еще не пробовал использовать, но пока не вижу, как определить другой драйвер для одной модели данных (location) и справиться ли я с этим. что, как бы я аннотировал отношения?

Спасибо за любой вклад!

1 Ответ

0 голосов
/ 03 июня 2019

Я тоже пытаюсь понять это по тем же причинам. Из того, что я прочитал, нет простого способа иметь простые отношения между сущностями, которыми управляют разные (Doctrine) менеджеры сущностей.

https://github.com/doctrine/orm/issues/5769

Использование отношений с несколькими менеджерами сущностей

Вы можете внедрить менеджер / регистратор сущностей в сущность 'event' и использовать ее для получения связанной сущности 'location', используя поле location_id. Хотя это возможно, это, вероятно, не самый чистый, поскольку вы делаете свои сущности зависимыми от менеджера сущностей.

https://matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/

Лучшим решением, вероятно, является настройка службы, которую вы вводите в сущность 'event'. Затем вы используете эту услугу, чтобы получить местоположение.

Использование EntityManager внутри сущностей Doctrine 2.0

Используя DoctrineRestDriver, вы подключаете объект местоположения так же, как любой другой объект, и вы должны иметь возможность запрашивать местоположение (из API) на основе location_id в событии. Эту логику вы можете легко вставить в зарегистрированный сервис, который вы можете использовать в объекте события.

Хотя служба и решает проблему получения местоположения из события, она не предоставляет вам способ выполнять запросы, объединяющие событие и местоположение. В запросах на ваше мероприятие вы будете ограничены идентификатором location_id.

Я не уверен, что произойдет, если вы зациклите набор из 10 событий, все в одном месте. Будет ли он вызывать API 10 раз, чтобы получить то же место? Можно ли решить эту проблему с помощью кэширования, чтобы уменьшить накладные расходы?

В качестве альтернативы, вы можете настроить отдельный процесс, который кэширует данные API в локальной базе данных, но добавляет другие сложности, особенно связанные с обеспечением актуальности вашего кэша с исходными данными. Представьте себе, что вы пытаетесь поддерживать кэш данных Карт Google в актуальном состоянии ...

...