2012-10-21 52 views
1

我有一個非常基本的表,只有幾列。它有15 records在裏面。Doctrine2獲取每個記錄的5個副本

現在,如果我用這個query

SELECT * FROM excursions WHERE lang_id = 1 

它返回5記錄如我所料

但是,當我使用doctrine2,它會創建這樣的查詢:

SELECT 
e0_.idx AS idx0, 
e0_.place_id AS place_id1, 
e0_.lang_id AS lang_id2, 
e0_.excursion_name AS excursion_name3, 
e0_.excursion_type AS excursion_type4, 
e0_.excursion_text_short AS excursion_text_short5, 
e0_.start_date AS start_date6, 
e0_.end_date AS end_date7, 
e0_.override_place AS override_place8, 
e0_.languages AS languages9, 
e0_.meeting_place AS meeting_place10, 
e0_.excursion_text AS excursion_text11, 
e0_.starts_at AS starts_at12, 
e0_.category_id AS category_id13, 
e0_.map_link AS map_link14, 
e0_.capacity AS capacity15, 
e0_.pick_up_time AS pick_up_time16, 
e0_.is_activity AS is_activity17 
FROM excursions e1_, excursions e0_ 
WHERE e0_.lang_id = 1 

現在,當我執行此,它返回25 records5 copy for each record。它們完全相同,但不是5它返回25記錄。 (5x5

哦是的,如果我刪除excursions e1_它將返回5條記錄。但爲什麼?

任何人都可以看看那個查詢,我錯過了什麼嗎?

我用QueryBuilder()

$qb = $this->getRepository()->createQueryBuilder('Excursions'); 
$qb->select('e')->from('Web\Bundle\ExcursionBundle\Entity\Excursions', 'e'); 
$qb->andWhere("e.langId = 1"); 

注意:我還做了其他的風格有或沒有QueryBuilder()。結果總是一樣的。 PHP得到了1每個副本。查詢我在服務器端執行得到5每個記錄的副本。

我在問這個,因爲如果學說得到了多次,如果我拿我的整個表如500記錄怎麼辦?它可能會抓取500x5不會放慢這個過程嗎?

+1

每一層間接都帶有價格。與僅僅專門查詢數據庫相比,ORM確實會減慢速度。所以我想你不要在這裏特別要求速度(因爲*結果很明顯*我會說),但可能如何做一個不同的查詢策略? – hakre

回答

2

沒有必要的行。正確的代碼是:

$qb = $this->getRepository()->createQueryBuilder('e'); 
$qb->andWhere("e.langId = 1"); 

你在你的代碼做的是添加「from」部分的兩倍。當您執行「createQueryBuilder」方法(它自己添加「select」和「from」)時,一旦通過Doctrine完成。您傳遞從未使用過的別名「Excursions」。然後添加別名爲「e」的第二個「from」。

+0

看,我知道我錯過了什麼。我是盲人,不,真的,盲目!從()中移除不必要的解決了這個問題。謝謝Gedrox讓我醒來。 – xangr