2014-10-29 29 views
1

我做了一些研究來回答它,但我沒有找到。使用查詢生成器或sql原則

我想知道什麼是做選擇的最佳實踐(含加盟)之間:

使用查詢生成器?

$this->getEntityManager()->createQueryBuilder() 
     ->select('e') 
     ->from('Module\Entity\MyEntity 'e') 
     ->innerJoin('Module\Entity\MyEntity2', 'e2', 'WITH', 'e.e2_id = e2.id')... 
     ->where("...") 

使用SQL語句?

$db = $this->getEntityManager()->getConnection(); 

$sql = "SELECT * FROM myEntity e 
     INNER JOIN myEntity2 AS e2 ON e2.id = e.e2_id.... 
     WHERE ....;" 

它更安全,更快速,......?

+0

@SBH在說DQL應該是您的默認選擇時是正確的。你的innerJoin例子不必要的複雜。 D2已經知道這些實體是如何相關的。一個簡單的innerJoin('e1.e2','e2')就是你所需要的,但大多數情況下你可能想要使用左連接。而且(在D2中)你永遠不會有一個名爲e2_id的屬性。只是e2。認爲對象,而不是ID的。 – Cerad 2014-10-29 14:10:49

回答

2

兩者都有優點和缺點,所以它取決於你需要什麼。

SQL

  1. 一個純粹的SQL語句是有點快,因爲你不必執行額外的邏輯從教義來
  2. 因爲學說試圖支持很多不同的數據庫,一些數據庫特定的功能,不支持,所以你不能使用它們或必須實現它們變成教條,它可以成爲很多工作

DQL

  1. 原則強制您使用準備好的語句,只要您堅持命名參數,就可以更輕鬆地執行預防注入攻擊。但是,使用命名參數,也可以使用純SQL和PDO來完成。
  2. 使用實體要容易得多。數據自動綁定到對象中,並通過您的應用程序進行管理。當然這會造成一些性能開銷
  3. 關於連接的一個缺點是您總是加入整個表格,而不是可能只有您需要的兩列。如果結果應該以對象有用的方式進行定義,則需要定義關係
  4. 最大的好處可能也非常罕見:如果更改數據庫,則不需要重新編寫所有查詢以匹配新的查詢結構

有時我發現自己處於一種可以直接在SQL查詢中解決問題的情況,但Doctrine不支持某些我不得不使用的構造。所以我必須決定是否想要失去Doctrine的好處,去尋求純粹的SQL解決方案,或者使用DQL,並添加更多的php代碼,甚至可能是更多不必要的查詢。但這很大程度上取決於情況,一般不能回答。

最後,我會盡可能使用DQL,因爲它更容易編寫和維護,只有在需要某些查詢才能實現高性能時才切換到SQL。