3

oneToManyとmanyToOneの関係を持つ2つのエンティティがあります

記事にはoneToManyタグがあります

ArticleTagにはmanyToOneの記事があります

$articleTags = $em->getRepository('Model\ArticleTag')
    ->findBy(array('article' => $articleId));

$qb->select('a')
    ->from('\\Model\\Article', 'a')
    ->where(':tags MEMBER OF a.tags')
    ->setParameter('tags', $articleTags);

そのクエリはエラーを返します:

An exception occurred while executing
    SELECT .. FROM article a0_ WHERE EXISTS (SELECT 1 FROM article_tag a1_ WHERE a0_.id = a1_.article_id AND a1_.id = ?, ?, ?)' with params {"1":8,"2":9,"3":10}
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' 9, 10)' at line 1

式' a1_.id=?、?、?で' = 'の代わりに''を使用する方法はありますか?'

4

2 に答える 2

4

この質問は古いですが、ここに答えがあります:

IN次のように、配列を入力として使用する場合に使用できます。

...  
->where( 'a.id IN (:tag_ids)' )  
->setParameter( 'tag_ids', $articleTags )  
...
于 2013-07-31T12:19:20.020 に答える
2

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はすでにわかっているので、タグから記事を取得するために別のクエリを作成する必要はありません。

getTagsDoctrine2 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;
}
于 2015-04-08T13:47:28.177 に答える