使用 symfony 使用来自另一个数据库的信息的最佳方式是什么
What is the best way of using information from another database using symfony
我有一个正在用 Symfony 构建的管理应用程序,我需要从其他应用程序 Genesys 获取信息,这是一个企业软件,用于处理从 phone 到在线聊天帮助的各种类型的通信,数据库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
您一定要创建对象并将其映射到 Genesys 数据库。
通常,您希望将与供应商(在本例中为 Genesys)相关的语法和交互从网站业务代码中移除。
为此,创建一个 UserRepository
(和其他存储库,具体取决于您管理的对象),它在内部使用 GenesysClient
。在 GenesysClient
中,您可以编写 Genesys 特定查询。
通过这种方式,您的代码与 Genesys 分离,更具可读性,如果需要,可以在 GenesysClient
中进行必要的更改。
假设您必须连接到 infomart
数据库连接,并且您需要获取 $someID
,它代表 PERSON
table 中的一个人;您将创建一个连接和 运行 一个查询,如下所示:
$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 服务器上,但这样就不会依赖任何其他 Bundle或 API。我用 Oracle 数据库做了类似的事情。
我有一个正在用 Symfony 构建的管理应用程序,我需要从其他应用程序 Genesys 获取信息,这是一个企业软件,用于处理从 phone 到在线聊天帮助的各种类型的通信,数据库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
您一定要创建对象并将其映射到 Genesys 数据库。 通常,您希望将与供应商(在本例中为 Genesys)相关的语法和交互从网站业务代码中移除。
为此,创建一个 UserRepository
(和其他存储库,具体取决于您管理的对象),它在内部使用 GenesysClient
。在 GenesysClient
中,您可以编写 Genesys 特定查询。
通过这种方式,您的代码与 Genesys 分离,更具可读性,如果需要,可以在 GenesysClient
中进行必要的更改。
假设您必须连接到 infomart
数据库连接,并且您需要获取 $someID
,它代表 PERSON
table 中的一个人;您将创建一个连接和 运行 一个查询,如下所示:
$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 服务器上,但这样就不会依赖任何其他 Bundle或 API。我用 Oracle 数据库做了类似的事情。