Php 使用symfony从另一个数据库使用信息的最佳方式是什么

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

我在Symfony中正在构建一个管理应用程序,我需要从其他应用程序获取信息,Genesys是一个企业软件,用于处理从电话到在线聊天帮助的各种通信,Genesys历史数据数据库面向对象且易于使用,但是我想知道与它交互的最佳方式是什么,我的Symfony项目已经建立了连接,但是我不确定我是否应该使用查询获取信息,或者根据Genesys design创建和映射对象,而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.开始时间作为校准日期
,RESOURCE_GI2.EMPLOYEE_ID作为Windows_用户
,RESOURCE_GI2.RESOURCE_NAME_ID
,RESOURCE_GI2.AGENT_FIRST_NAME
,RESOURCE_GI2.AGENT_姓氏
,交互\u事实\u GI2.SOURCE\u地址作为电话
,交互\事实\ GI2.目标\地址
,票号类型
,代理商建议
,项目类别
问题
解决方案
,storeID
,忠诚编号
,订单号
来自[IRF_用户_数据_客户_1]
加入交互\u资源\u事实\u GI2(交互\u资源\u事实\u GI2.交互\u资源\u ID=IRF\u用户\u数据\u客户\u 1.交互\u资源\u ID)
加入交互\u事实\u GI2 on(交互\u事实\u GI2.INTERACTION\u ID=交互\u资源\u事实\u GI2.INTERACTION\u ID)
加入日期\时间开启(日期\时间。日期\时间\键=交互\事实\ GI2.开始\日期\时间\键)
加入媒体类型打开(媒体类型。媒体类型\u键=交互\u资源\u事实\u GI2。媒体类型\u键)
在上加入资源(交互资源事实资源键=资源键=资源键)
在[INTERACTION\u TYPE]上加入[INTERACTION\u TYPE]。[INTERACTION\u TYPE\u KEY]=INTERACTION\u FACT\u GI2.INTERACTION\u TYPE\u KEY
其中[IRF\U USER\U DATA\U CUST\U 1]。票证类型=“”
和[IRF\U USER\U DATA\U CUST\U 1]。票证类型不为空
和MEDIA_TYPE.MEDIA_NAME IN('Voice','Email'))
和[交互类型]。交互类型='Inbound'
以及互动时间<'2017-01-26 00:00:00'和互动时间<'2017-01-27 23:59:59'
按交互顺序\u事实\u GI2.开始\u时间

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

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


通过这种方式,您的代码与Genesys分离,更具可读性,如果需要,可以在
Genesys客户端
中进行必要的更改。

因此,假设您必须连接到
信息集市
数据库连接,您需要获得
$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 );

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

我真的不会管理来自genesys的任何类型的身份验证,因此除了报告需要外,用户没有其他真正的需要,实际上连接的全部目的是能够报告呼叫,直接来自symfony项目的电子邮件和其他KPI您是否也认为,从将其与主业务代码分离的角度来看,我是否应该将所有genesys相关代码分离到单独的捆绑包中well@JulioVillalba我只是以
用户
为例。我确信您需要在Symfony代码中管理其他对象(电话、电子邮件等)。我肯定会为这些对象创建实体(模型)。您可以使用这些类创建一个单独的包或一个单独的名称空间文件夹,重要的是您需要将Genesys客户端定义为一个服务,并将其注入实体管理器(存储库)。然后在您需要的任何地方(例如控制器、表单、列表等)使用您的存储库。您所说的“我的Symfony项目已经建立了连接”是什么意思?这是否意味着您定义了两个数据库连接,第二个是Genesys数据库连接?我使用的是这样的东西(2个数据库),所以我试图了解你有什么,以及如何给你一个简单的解决方案。是的,我实际上有3个数据库连接,用于定义条令,Genesys有大约11个不同的数据库,但是到目前为止,我的需求可以通过两个主要数据库的信息和我的应用程序自己的数据库来满足。好的,请您展示一下您的
config.yml
文件,特别是
原则:dbal:connections:
部分。当然,感谢您的帮助。在效率和可维护性方面,这是更好的方法吗?即使在php中没有任何类型的对象,查询可能需要很长很难处理?我无法想象您在Symfony中创建各种实体来表示Genesys数据库中的所有对象,然后存储所有数据。另一个问题是,您将数据存储在两个地方,Genesys和Symfony。我必须做出同样的选择,是在实体中映射我们的Oracle Banner数据库(有数百万条记录),还是只查询数据库。可以想象,查询它非常简单。