实体中唯一的整数字段



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

/**
 * @ORMTable(name="users")
 * @ORMEntity
 * @ORMHasLifecycleCallbacks
 * @AssertBridgeUniqueEntity(
 *     groups={"registration"},
 *     fields="inviteCode",
  *     errorPath="not valid",
 *     message="This inviteCode is already in use."
 * )
 */
 class User extends AbstractUser implements UserInterface
 {
/**
 * @ORMColumn(type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @ORMColumn(type="string", length=500, unique=true)
 * @AnnotationSerializedName("_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;
} 

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

但我相信教义在这个问题上存在一些东西,或者也许有人有很好的榜样

有人

在这里提供了一个很好的答案 https://stackoverflow.com/a/13917309/4173130。

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

您可以使用像 ramsey/uuid 这样的 UUID 库。然后,您将能够使用 Uuid::uuid4(); 生成任何随机代码。

另一种解决方案是将 random_bytes() 与 base64_encodebase64_encode(random_bytes(32)) 一起使用。

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

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

在此处查看官方文档

相关内容

  • 没有找到相关文章

最新更新