Symfony2 - Doctrine - 过滤arrayCollection只获取一个对象

时间:2015-12-10 16:36:23

标签: php symfony doctrine-orm

我是学说的新手。我有实体和协会工作正常。 我的问题:

我有三个实体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。

感谢您的帮助。

2 个答案:

答案 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存在的注释。

无论如何都需要帮助