我有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
。
但是我相信学说对于这个问题存在某些东西,或者也许有人有这个
的好榜样答案 0 :(得分:3)
有人在这里提供了一个很好的答案https://stackoverflow.com/a/13917309/4173130。
但就像他最后说的那样,你不需要学说这么简单的功能。在构造函数中生成代码是一种高效,简单和清晰的解决方案。
您可以使用ramsey/uuid之类的UUID库。然后,您就可以使用Uuid::uuid4();
生成任意随机代码。
另一种解决方案是将random_bytes()与base64_encode
:base64_encode(random_bytes(32))
一起使用。
请勿尝试创建新功能以生成随机值。大部分时间都不安全,请参阅https://www.owasp.org/index.php/Insecure_Randomness。
答案 1 :(得分:1)
为什么不使用uuid?它作为核心功能包含在php中,我相信它符合您的需求。
查看官方文档here