我有这样一个协会:
聊天室> ----<用户
因此,聊天室可以包含多个用户,而用户可以属于多个聊天室。
现在我想选择包含几个用户的所有聊天室,只有这对夫妇。
我尝试了一些解决方案,比如这个:
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;
答案 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(或只是经过一些修改的用户),该函数返回包含仅这些用户的聊天室列表