使用Symfony 4复制插入



我有一个在用户之间聊天的代码/条件,比如:

$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();
}

您可以向数据库添加一个唯一的密钥,以防止添加相同的记录。这可以通过Chat实体中的UniqueConstraint注释来完成。


示例

它可能在您的Chat实体中显示如下:

use DoctrineORMMappingUniqueConstraint;
use DoctrineORMMapping as ORM;
/**
* @ORMTable(
*     name="chat", // your table name
*     uniqueConstraints={
*         @UniqueConstraint(name="chat_unique", columns={"firstUser", "secondUser"})
*     }
* )
*/
class Chat

更多信息

条令-唯一约束注释

最新更新