实体中的Symfony唯一整数字段

时间:2017-11-07 19:49:35

标签: symfony doctrine-orm unique-constraint

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

/**
 * @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;
} 

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

但是我相信学说对于这个问题存在某些东西,或者也许有人有这个

的好榜样

2 个答案:

答案 0 :(得分:3)

有人在这里提供了一个很好的答案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

答案 1 :(得分:1)

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

查看官方文档here