2014-04-23 3 views
0

Мне интересно, есть ли способ получить записи из одной таблицы, используя 2 отношения ManyToMany (это, вероятно, проще объяснить этим примером).Doctrine ManyToMany - объединение нескольких отношений

У меня есть 3 модели: статья, тема и тип и есть отношение ManyToMany между статьей < -> Тема и статья < -> Тип и то, что я ищу, это получить типы для статей, которые назначены к определенной теме. Надеюсь, что это имеет смысл.

Ниже приводится заявление моих лиц:

class Article 
{ 
    /** 
    * @var topics 
    * 
    * @ORM\ManyToMany(targetEntity="Topic") 
    * @ORM\JoinTable(name="article_topic") 
    */ 
    protected $topics; 

    /** 
    * @var types 
    * 
    * @ORM\ManyToMany(targetEntity="Type", inversedBy="articles") 
    * @ORM\JoinTable(name="article_type") 
    */ 
    protected $types; 
} 

class Topic 
{ 
    /** 
    * @var Article 
    * 
    * @ORM\ManyToMany(targetEntity="Article") 
    */ 
    private $articles; 
} 

class Type 
{ 
    /** 
    * @var Article 
    * 
    * @ORM\ManyToMany(targetEntity="Article") 
    */ 
    private $articles; 
} 

Теперь в моем TypeRepository у меня есть метод: (ОБНОВЛЕНО)

public function getByTopic($topic = null) 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder() 
     ->select('t') 
     ->from('Type', 't'); 

    if ($topic) { 
     $subqb = $this->getEntityManager()->createQueryBuilder() 
      ->select('a.id') 
      ->from('Article', 'a') 
      ->innerJoin('a.topics', 'atop', 'WITH', 'atop.id = :topicId') 
     ; 
     $qb->innerJoin('t.articles', 'ta') 
      ->where($qb->expr()->in('ta.id', $subqb->getDql()) 
      ->setParameter('topicId', $topic->getId()); 
    } 

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

и я получаю сообщение об ошибке: Invalid PathExpression. StateFieldPathExpression или SingleValuedAssociationField ожидается (но он показывает мне строку из шаблона ветви, и я изо всех сил пытаюсь разобраться в этом).

Вопросы, связанные с тем, как получить типы, присвоенные статьям, принадлежащим определенной теме.

Любые предложения оценены.
Спасибо.

ответ

0

Почему бы не делать что-то вроде этого:

$qb = $this->getEntityManager()->createQueryBuilder('ty') 
         ->addSelect('ty'); 
if ($topic) { 
    $qb->join('ty.articles','a') 
    ->addSelect('a') 
    ->join('a.topics','to') 
    ->addSelect('to') 
    ->where('to.id=:topic_id') 
    ->setParameter('topic_id',$topic); 
} 
return $qb->getQuery()->getResult(); 
Смежные вопросы