2017-03-02 64 views
1

我有一個管理應用建立在Symfony的使用從另一個數據庫信息的最佳方式,我需要來從其他應用程序,Genesys的是一個企業的軟件來處理各種類型的通信從手機信息網上聊天幫助,Genesys的歷史數據的數據庫是面向對象的,易於使用,但我不知道什麼是與它進行交互的最佳方式,我Symfony的項目已經建立連接,但我不能肯定我是否應該只需使用查詢獲取信息或根據Genesys設計創建和映射對象,而由於Genesys僅爲Java和Microsoft .Net提供此類軟件,因此SDK或庫不存在問題。什麼是使用symfony的


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 
+0

你是什麼意思「我的Symfony項目已經具備了連接設置」?這是否意味着您定義了2個數據庫Doctrine'連接',第二個是Genesys數據庫連接?我使用這樣的東西(2個數據庫),所以我試圖瞭解你有什麼,以及如何給你一個簡單的解決方案。 –

+0

是的我確實有3個數據庫連接,Genesys有大約11個不同的數據庫,但到目前爲止,我的需求可以滿足來自兩個主要數據庫和我自己的應用程序自己的數據庫的信息。 –

+0

好了,可以請你告訴你'config.yml'文件,尤其是'學說:DBAL:連接:'部分。 –

回答

1

您一定要創建對象並將其映射到Genesys數據庫。 一般情況下,你想推開供應商(創惟在此情況下)相關的語法和互動從網站業務代碼了。

爲此,請創建一個UserRepository(和其他存儲庫,取決於您管理的對象),它在內部使用GenesysClient。在GenesysClient中,您可以編寫Genesys特定查詢。

這樣,你的代碼是從Genesys的解耦,更具有可讀性,必要的修改可以在裏面GenesysClient如果需要進行。

+0

我真的不會管理來自genesys的任何類型的身份驗證,因此除了報告需求以外沒有真正需要用戶,實際上,連接的全部目的是能夠直接從symfony項目報告呼叫,電子郵件和其他KPI –

+0

你是否也認爲保持它與主業務代碼分離的條款,我是否應該將所有與genesys相關的代碼隔離到單獨的包中? –

+0

@JulioVillalba我只是使用'Users'作爲示例。我確定你有Symfony代碼需要管理的其他對象(Call,Email等)。我肯定會爲這些對象創建實體(模型)。您可以創建一個單獨的包或者一個單獨的名稱空間文件夾與類,重要的部分是您需要將Genesys客戶端定義爲服務並將其注入到實體管理器(存儲庫)中。然後在你需要的地方使用你的存儲庫(例如控制器,表單,列表等) – gskema

0

所以我們說,你必須連接到您的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); 

你需要還是弄清楚,你需要你的MS SQL Server上運行正確的SQL查詢,但再有就是對任何沒有依賴其他Bundle或API。我對Oracle數據庫做了類似的事情。

+0

就效率和可維護性而言這是更好的方法,即使查詢可能需要很長且難以處理而沒有任何類型的在PHP中的對象把它放在? –

+0

我無法想象你會在Symfony中創建各種實體來表示Genesys數據庫中的所有對象,然後必須「存儲」所有這些數據。另一個問題是,您是將數據存儲在Genesys和Symfony中的兩個地方。我必須做出同樣的選擇,無論我是否在實體中映射Oracle Banner數據庫(其中有數百萬條記錄),或者只是查詢數據庫。正如你可以想象的那樣,查詢它非常簡單。 –