Symfony2 - Doctrine - Фильтрация arrayCollection, чтобы получить только один объект

1

Я новичок в Доктрине. У меня есть организации и ассоциации. Мой вопрос:

У меня есть три объекта User, Comment, Comment_status. Комментарий связан с основной таблицей. Поиск, но в этом случае это не имеет значения.

Ассоциация: Комментарий <---1: n---> Comment_status <---n: 1---> Пользователь, который должен обрабатывать связь между списком комментариев пользователей и настройкой как/неприязнь для каждого из них.

Я использую TWIG, чтобы показать список комментариев на странице, и это достаточно для всех данных, таких как "дата", "например, счет" и т.д., Но если я хочу получить комментарий_статус для указанного пользователя (вход в wathing страницу), я не знаю Как это получить.

если я верну массив в TWIG "comments", а затем зациклирую его для каждого из них как "комментарий", я могу получить доступ с помощью {{comment.content}} к данным, но с комментарием_status. Я понятия не имею, потому что это массив, и я просто хотите, чтобы один элемент этого массива соответствовал идентификатору пользователя.

Я полагаю, что мне нужно сделать несколько запросов DQL к БД, но понятия не имею, как это сделать. Я читал некоторые о критериях в доктрине, но до сих пор не знаю, как их использовать.

Может ли кто-нибудь дать пошаговое решение?

части моего кода:

контроллер

> $comments = $em->getRepository('MySpecialBundle:Comment')
> ->findBy(array('finding' => $finding)); 
> 
> return array('comments' => $comments );

Объект комментария (часть, создающая ассоциацию)

> /**  * @ORM\OneToMany(targetEntity="Comment_status",
> mappedBy="comment", cascade={"persist", "remove"}, orphanRemoval=true)
> */  protected $commentStatuses;

Объект Comment_status (часть, которая создает ассоциацию)

>  /**  * @ORM\ManyToOne(targetEntity="Comment",
> inversedBy="commentStatuses")  * @ORM\JoinColumn(name="comment_id",
> referencedColumnName="id", nullable=false)  */  protected $comment;
/**

>  * @ORM\ManyToOne(targetEntity="My\MainBundle\Entity\User",
> inversedBy="commentStatuses")  * @ORM\JoinColumn(name="user_id",
> referencedColumnName="id", nullable=false)  */  protected $user;

Пользовательский объект (часть, создающая ассоциацию)

/**
     * @ORM\OneToMany(targetEntity="My\SpecialBundle\Entity\Comment_status", mappedBy="user", cascade={"persist"})
     */
     protected $commentStatuses;

Я хочу иметь способ получить (вместо этого массивную совокупность всех "commentStatuses") только один объект, содержащий идентификатор пользователя вошедшего в систему пользователя.

Спасибо за помощь.

Теги:
doctrine2

2 ответа

0
Лучший ответ

Благодаря @Richard я нашел способ решить эту проблему. Правильный ответ здесь:

$qb = $this->getEntitymanager()->createQueryBuilder();
$user = $qb->select('c, cs')
        ->from('MyBundle:Comment', 'c')
        ->leftjoin('c.commentStatuses', 'cs', 'WITH', 'cs.user = :user')
        ->setParameter('user', $myLoggedInUser)
        ->getQuery()->getResult();

Leftjoin - дает все записи из комментария, а не только содержит комментарийStatus WITH - выбирает только правильный комментарийStatuses

Если бы я использовал версию @Richard со вторым соединением и WHERE, он бы отображал только Комментарии, где есть пользователь и commentStatus.

В любом случае, за помощь

0

Вы можете выбрать и убрать только объекты, соответствующие вашим критериям, в запросе querybuilder доктрины. Таким образом вы получаете уже отфильтрованную коллекцию. Например, что-то вроде:

$qb = $this->getEntitymanager()->createQueryBuilder();
$user = $qb->select('u, cs, c')
        ->from('YourBundle:User', 'u')
        ->join('u.commentStatuses', 'cs')
        ->join('cs.comment', 'c')
        ->where($qb->expr()->eq('u', ':user')
        ->setParameter('user', $yourLoggedInUser)
        ->getQuery()->getResult();

Это даст вам ваш пользователь и комментарии/статусы, применимые только к этому пользователю.

  • 0
    Привет спасибо за ответ, однако я все еще застрял. Я не понимаю этого: -> где ($ qb-> expr () -> eq ('u', ': user'), где я могу прочитать об этом? Вы сделали, что пользователь является главной сущностью, но мне нужен комментарий как Основная сущность.
  • 0
    Я преобразовываю ваш запрос, чтобы сделать Комментарий основным объектом. Это работает, но не так, как я хотел. Например Если у меня есть 3 комментария, только 2 из них имеют comment_status формы user 1 и user 2, то после этого запроса я получил только 2 комментария, показывающих, где существует commment_status. Я хочу показать их все, но вместо массива comments_status с пользователем 1 и 2 только с указанным одним пользователем
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню