Каков наилучший способ использования информации из другой базы данных с помощью Symfony?

У меня есть приложение для управления, которое собирается в Symfony, и мне нужно извлекать информацию из другого приложения, Genesys, которое является корпоративным программным обеспечением для обработки различных типов сообщений от телефона до справки в онлайн-чате, база данных для исторических данных Genesys является объектно-ориентированной и простой в использовании. использовать, но мне интересно, что было бы лучшим способом взаимодействия с ним, мой проект Symfony уже настроил соединение, однако я не уверен, должен ли я просто получать информацию с использованием запросов или создавать и отображать объекты в соответствии с дизайном Genesys, и о SDK или библиотеке не может быть и речи, поскольку Genesys предоставляет такое программное обеспечение только для Java и Microsoft.Net.


config.yml

# Doctrine Configuration
doctrine:
    dbal:
         default_connection: cscc
        connections:
            cscc:
                driver:   pdo_mysql
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8                
            infomart:
                driver:   pdo_sqlsrv
                host:     '%database_host2%'
                port:     '%database_port2%'
                dbname:   '%database_name2%'
                user:     '%database_user2%'
                password: '%database_password2%'
                charset:  UTF8       
             wfm:
                driver:   pdo_sqlsrv
                host:     '%database_host3%'
                port:     '%database_port3%'
                dbname:   '%database_name3%'
                user:     '%database_user3%'
                password: '%database_password3%'
                charset:  UTF8 

Примите во внимание следующее: типы запросов, которые мне потребуется использовать в чисто SQL-подходе, довольно сложны и длительны.

Select DISTINCT INTERACTION_FACT_GI2.START_TS_TIME as cal_date
,RESOURCE_GI2.EMPLOYEE_ID as Windows_User
,RESOURCE_GI2.RESOURCE_NAME Ignition_ID
,RESOURCE_GI2.AGENT_FIRST_NAME
,RESOURCE_GI2.AGENT_LAST_NAME
,INTERACTION_FACT_GI2.SOURCE_ADDRESS as Phone
,INTERACTION_FACT_GI2.TARGET_ADDRESS
,TicketType
,AgentComment
,ItemCategory
,Problem
,Solution
,storeID
,LoyaltyNumber
,OrderNumber
 FROM [IRF_USER_DATA_CUST_1] 
 JOIN INTERACTION_RESOURCE_FACT_GI2 ON      (INTERACTION_RESOURCE_FACT_GI2.INTERACTION_RESOURCE_ID=IRF_USER_DATA_CUST_1.INTERACTION_RESOURCE_ID)
  JOIN INTERACTION_FACT_GI2 on (INTERACTION_FACT_GI2.INTERACTION_ID=INTERACTION_RESOURCE_FACT_GI2.INTERACTION_ID)
  JOIN DATE_TIME ON (DATE_TIME.DATE_TIME_KEY=INTERACTION_FACT_GI2.START_DATE_TIME_KEY)
  JOIN MEDIA_TYPE ON (MEDIA_TYPE.MEDIA_TYPE_KEY=INTERACTION_RESOURCE_FACT_GI2.MEDIA_TYPE_KEY)
  JOIN RESOURCE_GI2 ON (INTERACTION_RESOURCE_FACT_GI2.RESOURCE_KEY=RESOURCE_GI2.RESOURCE_KEY)
  JOIN [INTERACTION_TYPE] ON [INTERACTION_TYPE].[INTERACTION_TYPE_KEY] = INTERACTION_FACT_GI2.INTERACTION_TYPE_KEY

 Where [IRF_USER_DATA_CUST_1].TICKETTYPE =''
  AND [IRF_USER_DATA_CUST_1].TICKETTYPE IS NOT NULL
  AND MEDIA_TYPE.MEDIA_NAME IN ('Voice','Email')
  AND [INTERACTION_TYPE].INTERACTION_TYPE= 'Inbound'
  AND INTERACTION_FACT_GI2.START_TS_TIME  > '2017-01-26 00:00:00' and  INTERACTION_FACT_GI2.START_TS_TIME < '2017-01-27 23:59:59'

  order by INTERACTION_FACT_GI2.START_TS_TIME

2 ответа

Решение

Вам обязательно нужно создавать и отображать объекты в базу данных Genesys. Как правило, вы хотите отодвинуть синтаксис и взаимодействие с поставщиками (в данном случае Genesys) от бизнес-кода веб-сайта.

Для этого создайте UserRepository (и другие репозитории, в зависимости от того, какими объектами вы управляете), которые используются внутри GenesysClient, В GenesysClient Вы можете написать конкретные запросы Genesys.

Таким образом, ваш код отделен от Genesys, становится более читабельным, необходимые изменения могут быть сделаны внутри GenesysClient если нужно.

Допустим, вы должны были подключиться к вашему infomart подключение к базе данных, и вам нужно было получить $someID который представляет ЧЕЛОВЕКА в PERSON Таблица; Вы должны создать соединение и выполнить запрос следующим образом:

$someID = ...
...

$infomart = $this->get('doctrine.dbal.infomart_connection');

$query = "SELECT P.NAME,P.DATE,S.USER
          FROM PERSON P
          WHERE P.ID = '".$someID."'";
$result = $infomart->fetchAll( $query );

Вам все еще нужно будет определить правильный запрос SQL, который вам нужно выполнить на вашем MS SQL Server, но тогда нет никакой зависимости от любого другого пакета или API. Я делаю нечто подобное с базой данных Oracle.

Другие вопросы по тегам