实体中的 Symfony 唯一整数字段

Symfony unique integer fields in entity

我有带有 uniq 字段的实体,inviteCode。当我创建新实体时,我想自动设置一些随机代码,但此代码必须与数据库中存在的代码不同,你怎么看,你知道什么做法?

/**
 * @ORM\Table(name="users")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 * @AssertBridge\UniqueEntity(
 *     groups={"registration"},
 *     fields="inviteCode",
  *     errorPath="not valid",
 *     message="This inviteCode is already in use."
 * )
 */
 class User extends AbstractUser implements UserInterface
 {
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string", length=500, unique=true)
 * @Annotation\SerializedName("_invite_code")
 */
private $inviteCode;

我找到了类似的东西

    private function calculateReference($number)
{
    $multipliers = array(7,3,1);
    $length = strlen($number);
    $numberArr = str_split($number);

    $sum = 0;

    for ($i = $length - 1; $i >= 0; --$i)
    {
        $sum += $numberArr[$i] * $multipliers[($length - 1 - $i) % 3];
    }

    return $number.(10 - $sum % 10) % 10;
} 

首先从 table 获取最大 id,然后使用 id 调用函数 calculateReference,然后 setInviteCode

但是我相信学说对于这个问题是存在的,或者也许有人对此有很好的例子

为什么不使用 uuid?它作为核心功能包含在 php 中,我相信它适合您的需要。

查看官方文档here

有人在这里提供了很好的答案 。

但是就像他最后说的那样,对于这样一个简单的功能,您不需要教条。在构造函数中生成代码是一种高效、简单和清晰的解决方案。

您可以使用像 ramsey/uuid 这样的 UUID 库。然后你就可以用 Uuid::uuid4();.

生成任何随机代码

另一个解决方案是将 random_bytes()base64_encode 一起使用:base64_encode(random_bytes(32)).

请不要尝试创建新函数来生成随机值。大多数时候它是不安全的,参见 https://www.owasp.org/index.php/Insecure_Randomness.