2016-07-04 99 views
0

我目前正在使用Doctrine來管理實體的Symfony項目。Doctrine查詢生成器:結果返回兩倍相同的結果數組

我有一個名爲User的表,其中包含幾列,然後是另一個名爲Tag的表,其中包含該用戶表的一個外鍵,該表具有基於用戶標識的ManyToOne關係,以及另一個名爲value的列。

在我的應用程序中,我需要查找用戶列表,具體取決於標記行之一和用戶列之一的值。讓我們繼續:

選擇user.value等於某個值的所有用戶AND Tag.value等於另一個值。

因爲我在這個項目之前從來沒有使用過Symfony和Doctrine,所以我搜索了Doctrine文檔並發現了關於Query Builder的內容。所以,我這樣做:

編輯:我是這樣做是有點怪異的方式,所以我修改它,這裏是結果:

public function findByTagAndApp($tag, $app) 
{ 
    $em = $this->getEntityManager(); 
    $qb = $em 
     ->getRepository('APIBundle:User') 
     ->createQueryBuilder('u') 
     ->leftJoin('APIBundle\Entity\Tag', 't') 
     ->where('u.application = :app') 
     ->andWhere('t.tag = :tag') 
     ->setParameter('tag', $tag) 
     ->setParameter('app', $app) 
    ; 
    $users = $qb->getQuery()->getResult(); 
    return $users; 
} 

而且看起來它的工作原理,但在一個陌生的辦法。這不是返回一個User數組,它是我想要的,它返回一個User數組數組。第一個數組總是包含兩個條目,而這兩個條目總是相同的:它們是我需要的數組,沒有一個區別。

我試圖做返回$ users [0]而不是用戶,然後我可以操縱我的用戶實體的預期方式。我可以保持這種方式,因爲它工作,但我真的很想知道爲什麼它返回一個不需要的數組數組而不是我想要的數組。這可能是我的查詢,但我不知道如何修改它以獲取我想要的用戶。

任何線索爲什麼它的行爲將真正讚賞,因爲我還在學習教義。謝謝 !編輯²:沒關係,這個查詢看起來完全不正確,因爲我根據$ app值得到所有用戶,但它似乎從不檢查標記表中是否存在一行,其值與somevalue相關聯用戶表的外鍵..

+0

「從Tag表開始,選擇值等於somevalue的所有行並且User.someColumn等於anothervalue,然後從這些行中返回User元素。」你想要一個用戶的結果,但你選擇了奇怪的標籤(在getRepository中)。而且,我猜你的功能在你的控制器中?我強烈建議您使用自定義存儲庫類:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes – Elyass

+0

@Elyass查看我更新的問題:更改了直接從用戶表。現在你說出來了,我做了一個奇怪的方法。現在我不需要做Select('u'),因爲我從它開始。但問題沒有改變,使用上面的方法,我得到一個數組數組,第二個數組包含我需要的東西。使用返回$ users [0]而不是$ users,我可以做我需要的。但我真的想知道爲什麼發送兩次相同結果的數組,而不是direclty返回結果..哦,這種方法不是在控制器中,而是在我的UserRepository.php中。 :) – YumeYume

+1

我看到你解決了你的問題:)。我仍然想要添加一些精確性:如果你在你的用戶倉庫中,你不需要執行'$ em = $ this-> getEntityManager()',你可以直接使用'$ this - > _ em '(注意下劃線)。然後,'getRepository'也不需要,你就在這個倉庫中。你可以簡單地用'$ qb = $ this-> createQueryBuilder('u')'開始查詢 – Elyass

回答

0

後幾小時的調整,我用PhpMyAdmin上的SQL語句計算出來,所以我可以注意到有很多事情我做錯了:

首先,連接不正確。我的目標是收集在自己的表中具有特定值的用戶,以及來自Tag表的值。使用左連接,我用自己的值或標籤表中的值收集用戶。

第二:我傳遞的$ app值是一個Application類型的對象(我的User表中的Application字段是一個外鍵),查詢構建器不知道如何處理它。傳遞app_id而不是應用程序對象解決了問題。

第三:我收集結果的方式錯了。顯然,這個查詢返回一個User對象的數組。當我連續多次執行此查詢時,我有一個數組,我使用array_push來填充數據,認爲將數組array1推入array1會將array2的值放入數組1中,但它只是將數組2放入數組1中,導致該陣列是最初的問題。使用array_merge而不是array_push,我現在能夠將查詢中的所有結果收集到一個數組中。有一點array_unique,以避免冗餘,一切都按預期工作。

感謝大家回覆!

0

我不知道到底爲什麼它是,但.. 我認爲你必須從()之類->from('User', 'u') 額外提你可以找到here