5
我有我的product
實體這裏面對應的屬性:Symfony2:fetch =「EAGER」創建連接嗎?
/**
* @ORM\ManyToMany(targetEntity="Group", mappedBy="products", indexBy="id", fetch="EAGER")
*
*/
protected $groups;
我不知道,我對fetch="EAGER"
的理解是,一旦選擇了這個產品,應該得到羣體,這是發生了什麼,但它使用2個查詢,當我做一些像findBy()
一個查詢得到product
和另一個得到groups
。
反正有做findBy()
或其他輔助方法獲得沿着product
其groups
在一個查詢或唯一的辦法是寫一個自定義的庫函數,並做了LEFT-JOIN
自己?
UPDATE
我嘗試多種解決方案和endup覆蓋findBy()
功能是這樣的:
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
{
$q = $this
->createQueryBuilder('u')
->select('u, g')
->leftJoin('u.groups', 'g')
->setFirstResult($offset)
->setMaxResults($limit);
foreach ($criteria as $field => $value)
{
$q
->andWhere(sprintf('u.%s = :%s', $field, $field))
->setParameter($field, $value)
;
}
foreach ($orderBy as $field => $value)
{
$q->addOrderBy(sprintf('u.%s',$field),$value);
}
try
{
$q = $q->getQuery();
$users = $q->getResult();
return $users;
}
catch(ORMException $e)
{
return null;
}
}
問題
1 - 我可以使用fetch="EAGER"
使findBy返回product
連同其groups
在一個查詢
2 - 如果沒有,那麼是沒有辦法,我用fetch="EAGER"
與多對許多實體沒有查殺性能
3-壓倒一切的findBy是一個很好的做法無論如何?有什麼缺點?
謝謝,
據我所知,它不應該執行2個查詢 - 這是'EAGER'提取的關鍵。現在我想到了,我並不確定。我會盡快嘗試這個,只要我到我的開發箱... –
@jperovic我試了兩個不同的項目,它仍然執行2個查詢。如果是這種情況,我不明白爲什麼我會使用findBy或findOneBy作爲與其他實體有關係的實體,它總是大約70%到90%的實體在任何項目中。 – trrrrrrm
IT真的看起來像許多人一樣,fetch = eager並不是很有用,只是爲了好奇,如果你把產品實體作爲擁有者的一面,你會發現有什麼不同嗎? (改變mappedBy =「產品」inversedBy =「產品」) – Cesc