实体中的 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.
我有带有 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.