Php Symfony2-条令-过滤arrayCollection以仅获取一个对象

Php Symfony2-条令-过滤arrayCollection以仅获取一个对象,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我是新来的教条。我有实体和协会,运作良好。 我的问题: 我有三个实体:用户、评论、评论和状态。 注释连接到主表查找,但在本例中这并不重要 关联:注释状态用户 这应该处理用户等待评论列表和为每个用户设置喜欢/不喜欢之间的关系 我正在使用TWIG在页面上显示评论列表,这对于所有数据(如“日期”、“喜欢计数”等)来说已经足够了,但是如果我想获得指定用户的评论状态(登录等待页面),我不知道如何获取此信息 如果我将数组返回到细枝“comments”,然后将其作为“comment”循环,我可以使用{{com

我是新来的教条。我有实体和协会,运作良好。 我的问题:

我有三个实体:用户、评论、评论和状态。 注释连接到主表查找,但在本例中这并不重要

关联:注释状态用户 这应该处理用户等待评论列表和为每个用户设置喜欢/不喜欢之间的关系

我正在使用TWIG在页面上显示评论列表,这对于所有数据(如“日期”、“喜欢计数”等)来说已经足够了,但是如果我想获得指定用户的评论状态(登录等待页面),我不知道如何获取此信息

如果我将数组返回到细枝“comments”,然后将其作为“comment”循环,我可以使用{{comment.content}访问数据,但对于comment_状态,我不知道,因为它是一个数组,我只需要该数组中与登录用户ID匹配的一个元素

我想我必须向DB发出一些DQL请求,但不知道如何做到这一点。 我读了一些关于条令的标准,但仍然不知道如何使用它

谁能给出一个循序渐进的解决方案

我的部分代码:

控制器

> $comments = $em->getRepository('MySpecialBundle:Comment')
> ->findBy(array('finding' => $finding)); 
> 
> return array('comments' => $comments );
注释实体(创建关联的部分)

注释\状态实体(创建关联的部分)

用户实体(创建关联的部分)

我想有一种方法,只获取一个对象(而不是所有“CommentStatus”的数组集合),该对象包含登录用户的用户id


感谢您的帮助。

您可以在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();

这将获得您的用户以及仅适用于该用户的注释/状态。

您可以在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();

这将为您提供仅适用于该用户的用户和评论/状态。

感谢@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的记录 使用-仅选择正确的注释状态

如果我在第二次加入时使用@Richard version,并且它只显示用户和commentStatus存在的注释


无论如何,谢谢你的帮助

多亏了@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的记录 使用-仅选择正确的注释状态

如果我在第二次加入时使用@Richard version,并且它只显示用户和commentStatus存在的注释


无论如何,谢谢你的帮助

嗨,谢谢你的回答,不过我还是被卡住了。我不明白:->where($qb->expr()->eq('u',':user'))我可以在哪里读到它?你做了,用户是主要实体,但我需要作为主要实体的评论。我转换你的查询,使评论成为主要实体。它的工作,但不是我想要的。例如,如果我有3条评论,其中只有2条评论的状态形式为用户1和用户2,然后在该查询后,我只有2条评论显示在commment\u的位置ATU存在。我想显示所有注释,但不想显示用户1和2的数组注释\u状态,只显示指定的一个用户。如果我了解您,您想显示所有注释,而不管注释状态如何?您可以将连接更改为leftJoin,这将为您提供所有注释,无论注释状态是否存在。是的,这是正确的ht@Richard但是当我发现一个解决方案是不够的。左连接是一回事,但当我加入第三个表并使用WHERE时它仍然不起作用,正如你所说。相反,我删除了最后一个连接和WHERE,并在第一个左连接中添加了。现在它工作得很好。无论如何,谢谢你的时间。你帮了我很多,我会把一个正确的答案发布到第三个表是case.Hi谢谢你的回答,不过我还是被卡住了。我不明白这一点:->where($qb->expr()->eq('u',':user'))我可以在哪里读到它?你做了,用户是主要实体,但我需要作为主要实体的评论。我转换你的查询,使评论成为主要实体。它的工作,但不是我想要的。例如,如果我有3条评论,其中只有2条评论的状态形式为用户1和用户2,然后在该查询后,我只有2条评论显示在commment\u的位置ATU存在。我想显示所有注释,但不想显示用户1和2的数组注释\u状态,只显示指定的一个用户。如果我了解您,您想显示所有注释,而不管注释状态如何?您可以将连接更改为leftJoin,这将为您提供所有注释,无论注释状态是否存在。是的,这是正确的ht@Richard但是当我发现一个解决方案是不够的。左连接是一回事,但当我加入第三个表并使用WHERE时它仍然不起作用,正如你所说。相反,我删除了最后一个连接和WHERE,并在第一个左连接中添加了。现在它工作得很好。无论如何,谢谢你的时间。你帮了我很多,我会把一个正确的答案发布到第三个表情况就是这样。
$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();