我有一条代码/条件,可以在以下用户之间进行聊天:
$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:findChat函数
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();
}
您可以向数据库添加唯一键,这将阻止添加相同的记录。可以通过UniqueConstraint
实体中的Chat
注释来完成。
示例
它可能会在您的Chat
实体中看起来如下:
use Doctrine\ORM\Mapping\UniqueConstraint;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(
* name="chat", // your table name
* uniqueConstraints={
* @UniqueConstraint(name="chat_unique", columns={"firstUser", "secondUser"})
* }
* )
*/
class Chat
更多信息