【问题标题】:Duplicate insert with Symfony 4使用 Symfony 4 重复插入
【发布时间】: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


【解决方案1】:

您可以向数据库添加唯一键,以防止添加相同的记录。可以在 Chat 实体中使用 UniqueConstraint 注释来完成。


示例

它可能在您的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

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2023-03-23
    • 2016-03-06
    • 1970-01-01
    • 2020-05-23
    • 2018-09-15
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多