2012-11-03 21 views
1

我有兩個實體:ImageTags,具有多對多關係。有關相關實體字段的where子句的原則查詢buider

Image有一些領域:codedescriptionauthortags它實現了許多一對多的關係。

Tag只有兩個字段:nameimages

我建立一個非常通用的搜索形式,只是一個輸入字段,你可以寫任何文字,然後將返回有文本在其codedescriptionauthor領域,或以任何的任何Image其標籤name字段。

對於非關係字段很容易。我在我的控制器(query是用於搜索只是去GET參數):

$em = $this->getDoctrine()->getManager(); 

$qb = $em->getRepository('MyBundle:Image')->createQueryBuilder('i'); 

$qb 
->where(
     $qb->expr()->like('i.code', $qb->expr()->literal('%'.$request->get('query').'%')) 
    ) 
->orWhere(
     $qb->expr()->like('i.description', $qb->expr()->literal('%'.$request->get('query').'%')) 
    ) 
->orWhere(
     $qb->expr()->like('i.author', $qb->expr()->literal('%'.$request->get('query').'%')) 
    ); 

現在,我不知道如何着手爲tags的每個name場。

我曾嘗試在Image實體中使用虛擬字段,該實體將所有標記作爲字符串返回,但稍後在查詢生成器中不能使用它。

非常感謝!

回答

2
SELECT i FROM YourBundle:Image i 
LEFT JOIN i.tags t 
WHERE i.code LIKE :q OR i.desc LIKE :q OR i.author LIKE :q OR t.name LIKE :q 

這應該起作用。

符合QB:

$qb->leftJoin('i.tags', 't') 
    ->where($qb->expr()->like('t.name', $qb->expr()->literal('%' . $query . '%'))); 
+0

+1。感謝您的回答。這種方式有效。但我會主張使用查詢生成器而不是DQL。我認爲一個好的ORM應該鼓勵以面向對象的方式工作。如果沒有人提出查詢構建器的替代方案,我會將您的答案設置爲正確的。 –

+0

我檢測到它有問題。使用這種方式,搜索時不考慮沒有標籤的圖像。 –

+1

然後應該有LEFT JOIN。 – nikita2206