与Symfony 4重复插入

问题描述 投票:0回答:1

我有一条代码/条件,可以在以下用户之间进行聊天:

    $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();
}
php symfony doctrine-orm doctrine symfony4
1个回答
0
投票

您可以向数据库添加唯一键,这将阻止添加相同的记录。可以通过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

更多信息

Doctrine - UniqueConstraint Annotation

© www.soinside.com 2019 - 2024. All rights reserved.