我是学说的新手。我有实体和协会工作正常。 我的问题:
我有三个实体User,Comment,Comment_status。 注释连接到主表Finding,但在这种情况下这无关紧要。
协会:评论< --- 1:n ---> Comment_status< --- n:1 --->用户 这应该处理用户之间的关系,这些用户会评论评论列表并为每个评论设置喜欢/不喜欢。
我正在使用TWIG在页面上显示评论列表,这对于所有数据都足够了,例如“date”,“like count”等等但是如果我想为指定用户获取comment_status(在看到页面时)我不知道该怎么做。
如果我将数组返回到TWIG“注释”,然后将其作为“注释”循环它,我可以使用{{comment.content}}访问数据但是使用comment_status我不知道因为它是一个数组我只想要一个与登录用户ID匹配的数组元素。
我想我必须让一些DQL向DB询问,但不知道如何做到这一点。 我在Doctrine中读到了一些关于Criteria的内容,但仍然不知道如何使用它。
任何人都可以一步一步解决问题吗?
我的部分代码:
控制器
> $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”的数组集合)只有一个对象,其中包含用户登录的用户ID。
感谢您的帮助。
答案 0 :(得分:0)
您可以在doctrine 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();
这将使您的用户和评论/状态仅适用于该用户。
答案 1 :(得分: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 - 提供来自Comment的所有记录,不仅包含commentStatus WITH - 只选择正确的commentStatuses
如果我将@Richard版本与第二次加入和WHERE一起使用,它将仅显示用户和commentStatus存在的注释。
无论如何都需要帮助