@KOS_MOS

Проверка существования связи many-to-many в Doctrine?

У меня есть класс Article:

/**<br>
 * @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\User", inversedBy="like_articles")<br>
 */<br>
protected $like_users;<br>




и класс User:

/**<br>
 * @ORM\ManyToMany(targetEntity="Acme\BlogBundle\Entity\Article", mappedBy="like_users")<br>
 */<br>
protected $like_articles;<br>




Установленная связь обозначает, что пользователь отметил статью как понравившуюся.



И естественно пользователь может отметить одну статью один раз, чтобы это проверить делаю так:

$article = $em->find('AcmeBlogBundle:Article', $article_id);<br><br>
if($article->getLikeUsers()->contains($this->getUser()))<br>
{<br>
    throw new BadRequestHttpException('Relationship exist');<br>
}<br><br>




Включаю query log в mysql и вижу, что для проверки contains генерируется следующий запрос:

SELECT <br>
  t0.username AS username1,<br>
  ...<br>
FROM<br>
  user t0 <br>
  INNER JOIN article_user <br>
    ON t0.id = article_user.user_id <br>
WHERE article_user.article_id = '6252';<br>




Логично было бы если бы в запросе было еще:

AND t0.id = <id пользователя><br>



То есть, получается, если за статью проголосует 10000 человек, то для проверки голосовал ли 10001 пользователь будет извлекаться 10000 записей?



Я новичок в Symfony, подскажите, что не так?
  • Вопрос задан
  • 3394 просмотра
Пригласить эксперта
Ответы на вопрос 2
hell0w0rd
@hell0w0rd
Просто разработчик
Логично было бы если бы в запросе было еще:

Не логично. джоин покрывает это условие с головой
Ответ написан
stnw
@stnw
Потому что Вы с пользователем сверяете позже в пхп, а не в самом запросе. Должно быть что-то вроде этого:

$count = $this->entityManager->getRepository('AcmeBlogBundle:Article')->createQueryBuilder('a')
             ->select('COUNT(a)')
            ->join('a.like_users', 'u')
            ->where('a.id = :article_id')
            ->setParameter("article_id", $article_id)
            ->andWhere('u.id = :user_id')
            ->setParameter("user_id", $this->getUser()->getId())
           ->getQuery()
            ->getSingleScalarResult();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы