lordjanscoが言ったように、古い質問ですが、私はそれを見つけた他の人に少し拡張したいと思いました。
a.id
タグIDではなく記事IDを参照しているため、lordjancsoの回答を拡張します。関連するタグから記事を取得するには、IN
をオンにして内部結合を実行する必要があります。a.tags
そのようです。
$articleTags = $em->getRepository('Model\\ArticleTag')
->findBy(array('article' => $articleId));
$qb = $em->createQueryBuilder();
$query = $qb->select('a')
->from('\\Model\\Article', 'a')
->innerJoin('a.tags', 't', 'WITH', 't.id IN (:tags)')
->setParameter('tags', $articleTags)
->getQuery();
$result = $query->getResult();
ただし、記事IDはすでにわかっているので、タグから記事を取得するために別のクエリを作成する必要はありません。
getTags
Doctrine2 ORMを使用していて、エンティティがManyToOneとして設定されている場合は、代わりに記事から呼び出すことができるはずです。
$article = $em->getRepository('Model\\Article')->findOneById($articleId);
$articleTags = $article->getTags();
または、必要に応じて、各タグを反復処理することもできます。
$articleTags = $em->getRepository('Model\\ArticleTag')
->findBy(array('article' => $articleId));
foreach ($articleTags as $articleTag) {
$article = $articleTag->getArticle();
}
エンティティに双方向の1対多の関連付けが構成されていることを確認します。
http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-many-bi direction
そのようです:
use \Doctrine\Common\Collections\ArrayCollection;
/** @Entity **/
class Article
{
/**
* @var ArrayCollection|ArticleTags[]
* @ORM\OneToMany(targetEntity="ArticleTags", mappedBy="article")
*/
private $tags;
public function __construct()
{
$this->tags = new ArrayCollection;
}
/**
* @return ArticleTags[]|ArrayCollection
*/
public function getTags()
{
return $this->tags;
}
}
/** @Entity **/
class ArticleTags
{
/**
* @var Article
* @ORM\ManyToOne(targetEntity="Article", inversedBy="tags")
* @ORM\JoinColumn(name="article", referencedColumnName="id")
*/
private $article;
}