查找仅包含其他实体的实体

时间:2017-05-01 19:08:25

标签: sql symfony doctrine-orm doctrine

我有这样一个协会:

聊天室> ----<用户

因此,聊天室可以包含多个用户,而用户可以属于多个聊天室。

现在我想选择包含几个用户的所有聊天室,只有这对夫妇。

我尝试了一些解决方案,比如这个:

    public function findByUsers($firstUser, $secondUser){
    $qb = $this->createQueryBuilder('c');
    $qb
        ->select('c')
        ->where('c.users LIKE :firstUser')
        ->andwhere('c.users LIKE :secondUser')
        ->setParameters(array(
            'firstUser' => $firstUser,
            'secondUser' => $secondUser
        ));

    return $qb->getQuery()->getResult();
}

但是它不起作用并且给我带来了那种错误:

[Semantical Error] line 0, col 52 near 'users LIKE :firstUser': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

某些遇到此错误的用户通过在查询选择器之前添加IDENTITY来解决此问题,但我不明白如何在我的情况下应用它。

那么,是否有人知道如何获得包含我的几个用户的所有聊天室?

非常感谢!

编辑:添加学说关系注释

user.php的

/**
 *
 * @ORM\ManyToMany(targetEntity="Chatroom", inversedBy="users")
 * @ORM\JoinTable(name="chatrooms_users",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="chatroom_id", referencedColumnName="id")}
 *      )
 */
private $chatrooms;

Chatroom.php:

/**
 * @ORM\ManyToMany(targetEntity="User", mappedBy="chatrooms")
 */
private $users;

1 个答案:

答案 0 :(得分:0)

我的最终解决方案是:

public function findByUsers($ids)
{
    $count = count($ids);
    $qb = $this->createQueryBuilder('chatroom');
    $qb->select('chatroom')
        ->join('chatroom.users', 'u')
        ->addSelect('COUNT(u) AS HIDDEN ucount')
        ->groupBy('chatroom.id')
        ->having('ucount = :count')
        ->setParameter('count', $count);

    foreach ($ids as $key => $id) {
        $qb->andWhere(':id' . $key . ' MEMBER OF chatroom.users')
            ->setParameter('id'.$key, (int) $id);
    }

    return $qb->getQuery()->getOneOrNullResult();
}

传递一组用户ID(或只是经过一些修改的用户),该函数返回包含仅这些用户的聊天室列表