Я новичок в Доктрине. У меня есть организации и ассоциации. Мой вопрос:
У меня есть три объекта 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") только один объект, содержащий идентификатор пользователя вошедшего в систему пользователя.
Спасибо за помощь.
Благодаря @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.
В любом случае, за помощь
Вы можете выбрать и убрать только объекты, соответствующие вашим критериям, в запросе 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();
Это даст вам ваш пользователь и комментарии/статусы, применимые только к этому пользователю.