2012-09-25 92 views
0

我使用一個比喻來使我的觀點更容易理解。讓我們想象一個圖書館。我們有書籍,書籍集合和用戶。 書籍,收藏和用戶是我的實體。加入請求:OneToMany + ManyToMany

  • 一件收藏品有許多書籍(一對多,bidirectionnal)
  • 一本書可能已經被幾個用戶讀取(多對多,bidirectionnal)

我已經建立了三個實體之間的這些關係,到目前爲止,似乎很好。

的問題是:如何顯示圖書的清單對於給定的集合,如果當前用戶已經閱讀那些書籍?

我開始與該請求書的清單;我不知道如何爲用戶添加子請求或類似的東西:

class CollectionRepository extends EntityRepository { 
    public function getCollectionWithBooks($collectionName) { 
     $qb = $this->createQueryBuilder('c') 
      ->leftJoin('c.books', 'b') 
      ->where('c.urlname = :collectionName') 
       ->setParameter('collectionName', $collectionName) 
      ->addSelect('b'); 

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

    } 
} 

非常感謝!

+1

如果您已經將書籍和用戶之間的MTOM你應該能夠使一個方法getUsers在書籍的實體。這將返回一個ArrayCollection(如果你這樣聲明),只是做一個in_array或任何要知道,如果你的用戶讀過那本書與否。 (如果我不清楚或者你需要一個例子告訴我) – Snroki

+0

謝謝你的幫助。最後,我注意到,當我用控制檯更新實體時,arraycollection和setter是由Symfony創建的。 – Yako

回答

0

找到了答案感謝Coussinsky。

這是最後更復雜的比我預期的:)

首先,我們需要鏈接到圖書的用戶的getter/setter。 這可以通過控制檯更新本書實體來完成,如:

php app/console doctrine:generate:entities appLibraryBundle:Book 

我們將有一個getUsers()方法返回一個ArrayCollection。

在樹枝顯示,我們可以做這樣的事情:

{% for book in collectionWithBooks.books %} 
    {% if app.user in book.users %}You have read this book.{% endif %} 
{% endfor %}