2010-04-20 91 views
62

教義,你可以通過兩種方式創建DQL:教條:QueryBuilder vs createQuery?

的EntityManager ::的createQuery

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1'); 

的QueryBuilder

$qb->add('select', 'u') 
    ->add('from', 'User u') 
    ->add('where', 'u.id = ?1') 
    ->add('orderBy', 'u.name ASC'); 

我不知道有什麼區別,那些不應該我用?

回答

60
  1. DQL更容易閱讀,因爲它非常類似於SQL。如果您不需要根據一組參數更改查詢,則這可能是最佳選擇。

  2. 查詢生成器是一個構建查詢的api,因此如果您需要像遍歷一組參數或過濾器一樣動態構建查詢,它會更容易。您不需要執行任何字符串操作來構建查詢,如連接,分割或其他任何操作。

+0

但是在第一種情況下解析DQL字符串沒有開銷嗎?或者,構建器也會生成相同的DQL字符串? – 2014-12-03 08:34:21

+2

是的,QueryBuilder爲你創建DQL字符串。之後,無論如何,DQL都會被解析。 – Dennis 2015-10-07 15:33:49

31

查詢生成器是正義的,可以說,界面來創建查詢......這應該是更舒適的使用,它不剛纔add()方法,而且方法等,其中(),andWhere( ),from()等等。但最後,它只是編寫了一個查詢,就像您在createQuery()方法中使用的查詢一樣。更先進的Query Builder

例子:

$em->createQueryBuilder() 
      ->from('Project\Entities\Item', 'i') 
      ->select("i, e") 
      ->join("i.entity", 'e') 
      ->where("i.lang = :lang AND e.album = :album") 
      ->setParameter('lang', $lang) 
      ->setParameter('album', $album); 
+0

你可以添加 - > setParameters(array('x'=>'y','z'=>'w',...)) – 2015-09-15 08:19:14

13

它們有不同的用途:

  • DQL是容易當你知道你的完整的查詢使用。
  • 查詢生成器是聰明的,當你有根據一些條件來建立你的查詢,循環等
4

的主要區別是調用方法的開銷。你的第一個代碼示例(createQuery)只是爲了簡單起見,它使得一個方法調用,而queryBuilder使得4.在所有事情結束時,它們歸結爲一個必須被執行的字符串,第一個例子是你給它的字符串,另一個你用多個鏈式方法調用來構建它。

如果您正在尋找一種理由來使用另一種,那麼這是一個風格問題,而且看起來更具可讀性。對我而言,我大多數時候都喜歡queryBuider,它爲查詢提供了明確定義的部分。而且,在過去,它使得在需要時添加條件邏輯變得更加容易。

+0

一個小的觀察 - 我會說幾乎任何時間花在任何數量與SQLing相關的PHP函數調用總是不如從數據庫中談話,等待和提取實際結果所花費的時間(更不用說在ORM的情況下補充這些結果)。 – userfuser 2018-01-30 09:03:44

1

在使用查詢構建器時進行單元測試可能更容易。假設您有一個存儲庫,可以根據複雜的條件列表查詢一些數據。並且您要確保如果將特定條件傳遞到存儲庫中,則會在查詢中添加其他一些條件。在DQL的情況下,您有兩種選擇:

1)使用燈具並測試與數據庫的真實交互。我覺得有點麻煩和ununitestish。

2)檢查生成的DQL代碼。這可能會讓你的測試過於脆弱。

使用QueryBuilder,您可以用模擬替換它,並驗證調用了「andWhere」方法和所需的參數。當然,如果您的查詢很簡單並且不依賴於任何參數,則這些注意事項不適用。