我目前正在使用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相關聯用戶表的外鍵..
「從Tag表開始,選擇值等於somevalue的所有行並且User.someColumn等於anothervalue,然後從這些行中返回User元素。」你想要一個用戶的結果,但你選擇了奇怪的標籤(在getRepository中)。而且,我猜你的功能在你的控制器中?我強烈建議您使用自定義存儲庫類:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes – Elyass
@Elyass查看我更新的問題:更改了直接從用戶表。現在你說出來了,我做了一個奇怪的方法。現在我不需要做Select('u'),因爲我從它開始。但問題沒有改變,使用上面的方法,我得到一個數組數組,第二個數組包含我需要的東西。使用返回$ users [0]而不是$ users,我可以做我需要的。但我真的想知道爲什麼發送兩次相同結果的數組,而不是direclty返回結果..哦,這種方法不是在控制器中,而是在我的UserRepository.php中。 :) – YumeYume
我看到你解決了你的問題:)。我仍然想要添加一些精確性:如果你在你的用戶倉庫中,你不需要執行'$ em = $ this-> getEntityManager()',你可以直接使用'$ this - > _ em '(注意下劃線)。然後,'getRepository'也不需要,你就在這個倉庫中。你可以簡單地用'$ qb = $ this-> createQueryBuilder('u')'開始查詢 – Elyass