2015-09-26 84 views
2

我有4個表,實體中的屬性都相應地映射。我試圖根據選定的標籤查詢文章。Symfony2映射4表內聯接查詢到Doctrine QueryBuilder

articles => id, title, author_id - NAMESPACE AppBundle/Enity/Article 
tags => id, name - NAMESPACE AppBundle/Entity/Tag 
article_tags => article_id, tag_id 
authors=> id, name - NAMESPACE AppBundle/Entity/Author 

我已經找到了如何獲得由標籤有ID的相關人士他們在article_tags表和過濾通過作者ID以及所有文章。在SQL中,我的查詢看起來像這樣。經過測試和工作。

SELECT 
    articles.title, articles.id, authors.name 
FROM 
    article_tags 
INNER JOIN tags 
    ON article_tags.tag_id = tags.id 
INNER JOIN articles 
    ON article_tags.article_id = article.id 
INNER JOIN authors 
    ON authors.id = articles.author_id 
WHERE 
    tags.id IN (1,2) 

我想構建一個代表上述sql的查詢。到目前爲止,我的理解是,學說會根據實體中的ORM斷言自動選取所需的關聯。不過,我不確定如何將其他實體帶入查詢。這是我迄今爲止所擁有的。

我在文章回購代碼:

$qb = $this->createQueryBuilder('ar') 
      ->select('ar.title, ar.id, au.name') 
      ->from('article_tags', 'at') 
      ->innerJoin('tags', 't', 'WITH', 'at.tag_id = t.id') 
      ->innerJoin('ar', 'WITH', 'at.article_id = ar.id') 
      ->innerJoin('authors', 'au', 'WITH', 'au.id = ar.author_id') 
      ->where('at.id IN (1,2)'); 

    return $qb->getQuery()->getResult(); 

我已經嘗試了上面的代碼與兩個「與」關鍵字「ON」和。

我的錯誤是: [語義錯誤] 0行,列76 '附近的標籤T,帶at.tag_id':錯誤:類 '標籤' 沒有定義。

回答

2

當你正在做與學說ORM的連接,您應該不需要指定連接條件,應該在你的實體的元數據。

所以在您的實例您有關於標籤和作者的文章,如果你想標記和作者的文章一起,您的查詢應該是這個樣子:

// this is in the article repository I'm guessing? 
$qb = $this->createQuieryBuilder('ar'); 
$qb->addSelect([ 't', 'au' ]) 
    ->join('ar.tags', 't') 
    ->join('ar.authors', 'au') 
    ->where($qb->expr()->in('a.tags', ':tags')) 
    ->setParameter('tags', [ 1, 2 ]); 

所以兩個連接語句關於實體的屬性,在這種情況下爲tagsauthors。在您的文章實體中,您需要將它們設置爲根據the documentation的關聯。元數據定義了文章如何與標籤和作者相關聯,並且Doctrine將(通常)填補空白。您的查詢看起來像仍在思考SQL,而不是實體和Doctrine(和DQL)。

作爲一個側面說明,上面的是不是一個偉大的查詢做返回的將相當於標籤和作者數量的行數,你會更好做了查詢,而無需在額外的實體選擇,然後抓取標籤(例如通過做$article->getTags())。