我有一個OneToMany
關係,一個足球隊有很多球員。我想列出所有的足球隊並顯示每個隊的隊長名字。Symfony2 +學說 - 過濾
每個玩家的實體有一個外鍵(TEAM_ID)和被設置爲0或1。我目前正在運行下面的問題涉及的領域「隊長」:
$teams = $this
->getDoctrine()
->getRepository('FootballWebsiteBundle:Team')
->createQueryBuilder('t')
->setFirstResult(($pageNumber * $resultPerPage) - $resultPerPage)
->setMaxResults($resultPerPage)
->add('where','t.deleted = 0')
->add('orderBy', 't.name DESC')
->getQuery()->getResult();
後來,當我遍歷每個球隊在樹枝我跑team.getTeamCaptain()的getName(),這是我的球隊實體內的過濾器:
public function getTeamCaptain() {
$them = $this->players->filter(function($p) {
return $p->getCaptain() == 1;
});
return $them->first();
}
有沒有更好的方式來運行此查詢?
對於那些被這個答案困惑的人來說:最後一個答案回答了提出的具體問題,其餘的答案都是關於改善需要改進的情況,但實際上並沒有被問到。 – Lighthart 2013-02-14 00:53:51
@Lighthart:不,用戶要求一種優化邏輯的方法。他的初始版本產生了'N * M + 1'查詢,因爲'Team#players'集合的延遲初始化,然後是這些集合中的單個玩家,以檢查'player.captain == 1'。僅優化'getTeamCaptain'仍然會導致'N + 1'查詢初始化集合。獲取 - 加入「Team#players」集合可以將所有這些邏輯縮減爲「1」單個查詢。 因此,僅在這裏優化'getTeamCaptain'遠遠不夠。 – Ocramius 2013-02-14 00:58:18
paginator與此無關。 – Lighthart 2013-02-14 00:59:27