【发布时间】:2019-11-05 10:27:53
【问题描述】:
我有一个在用户之间进行聊天的代码/条件,例如:
$chat = $chatRepository->findChat($firstUser, $secondUser);
if (!$chat) {
$chat = new Chat();
$chat->setSecondUser($secondUser);
$chat->setFirstUser($firstUser);
$entityManager->persist($chat);
$entityManager->flush();
} else {
...
}
return $chat;
因此,如果用户之间的聊天实体不存在,我将创建它。问题是,不知何故,从前端到达了两个以秒差一半的方式获取此聊天的请求,并且在数据库中我得到了两条相同的记录:
id first_user second_user time
1 1 2 10:20:20
2 1 2 10:20:21
这是错误的。如果没有唯一索引,我该如何解决?谢谢
UPD:查找聊天功能
public function findChat($userId, $otherUserId)
{
$qb = $this->createQueryBuilder('u');
$qb->where($qb->expr()->orX(
$qb->expr()->andX(
$qb->expr()->eq('u.firstUser', ':firstUser'),
$qb->expr()->eq('u.secondUser', ':secondUser')
),
$qb->expr()->andX(
$qb->expr()->eq('u.firstUser', ':secondUser'),
$qb->expr()->eq('u.secondUser', ':firstUser')
)
));
$qb->setParameter('firstUser', $userId);
$qb->setParameter('secondUser', $otherUserId);
$qb->orderBy('u.dateCreated', 'DESC');
return $qb->getQuery()->getOneOrNullResult();
}
【问题讨论】:
-
为什么不将其定义为多对多关系呢?这样您就可以拥有任意数量的用户,而无需添加列
-
在两个外键上使用唯一索引有什么问题?然后,如果您使用来自两个 FK 的复合键,则可以摆脱
id -
多对多对我来说不合适,因为我简化了这个表,它确实更复杂(更多字段)。但是 Doctrine 不支持带有额外字段的 ManyToMany。
-
findChat真的有效吗?你也可以LOCK桌子。 -
在问题中添加了这个功能,我看到了这个学说页面,但我真的不明白如何将它应用于我的情况,你能指点我吗?
标签: php symfony doctrine-orm doctrine symfony4