1

我在 Symfony 中构建了一个管理应用程序,我需要从其他应用程序中获取信息,Genesys 是一个企业软件,用于处理从电话到在线聊天帮助的各种类型的通信,Genesys 历史数据的数据库是面向对象的并且易于使用,但我想知道与之交互的最佳方式是什么,我的 Symfony 项目已经建立了连接,但是我不确定是否应该使用查询获取信息或根据 Genesys 设计创建和映射对象,并且 SDK 或库是不可能的,因为 Genesys 只为 Java 和 Microsoft .Net 提供此类软件。


配置.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
4

2 回答 2

1

您绝对应该创建对象并将其映射到 Genesys 数据库。通常,您希望将与供应商(在本例中为 Genesys)相关的语法和交互从网站业务代码中推开。

为此,请创建一个UserRepository(和其他存储库,具体取决于您管理的对象),它在内部使用GenesysClient. 您可以在其中GenesysClient编写 Genesys 特定查询。

通过这种方式,您的代码与 Genesys 分离,更具可读性,如果需要,可以在内部进行必要的更改GenesysClient

于 2017-03-02T14:53:56.690 回答
0

因此,假设您必须连接到您的infomart数据库连接,并且您需要获取表$someID中代表 PERSON 的那个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 );

您仍然需要找出需要在 MS SQL Server 上运行的正确 SQL 查询,但不依赖于任何其他 Bundle 或 API。我对 Oracle 数据库做了类似的事情。

于 2017-03-02T17:48:45.723 回答