我知道有很多关于这个的帖子,但到目前为止还有一些事情没有回答。不在这里或在Laracast论坛上。
No.1 :这样做的最佳做法是什么?我看到了几种不同的方式。我应该在模型中还是在控制器中设置它?是否有自动化方式或只是PHP dist
功能?
No.2 :如何处理新生成的密钥可能重复的可能性?我必须手动检查吗?我知道如果你试图在数据库中输入副本,Laravel会抛出垃圾错误,我不希望在实时应用程序上出现这种错误。
No3 :它会降低应用程序的速度吗?我的猜测是,如果必须检查重复项,如果数据库很大,则会很慢。
No.4 :是否应该这样做?我想将此密钥作为其事务密钥提供给网站上的客户。我不想知道他们之前的交易可能有多少,或者给他们任何有关这方面的信息。安全原因。
我能猜出答案,但我并不是百分百肯定。如果有人这样做了,我将不胜感激。
答案 0 :(得分:2)
我认为将随机字符串生成为主键是不错的设计。
如果你想"隐藏"您的交易ID可以使用vinkla/laravel-hashids对表格密钥进行哈希/混淆。
答案 1 :(得分:1)
我将使用整数主键并为字符串键添加单独的列(具有唯一索引)。整数键更快,更容易处理(在连接等)。
如果字符串键具有固定长度,则应使用CHAR
列以获得最佳性能。
我会将密钥生成放入控制器:
$key = str_random(6);
while(YourModel::where('key', $key)->exists()) {
$key = str_random(6);
}
$yourModel->key = $key;
或者您只是尝试一个密钥并捕获重复值的不太可能的情况:
$yourModel->key = str_random(6);
try {
$yourModel->save();
catch(Illuminate\Database\QueryException $e) {
<code from above>
$yourModel->save();
}
答案 2 :(得分:1)
No.1 :您可以使用uniqid()
它会根据当前时间(以微秒为单位)生成唯一标识符,您可以这样做以确保它的唯一性$id = uniqid().str_random(5);
No.2 :使用上面的答案,几乎不可能获得重复的密钥,但你可以这样做,100%避免它
try {
$model->id = uniqid().str_random(5);
$model->save();
}catch(\Exception $e)
{
if something wrong happens try again or you can make it recrussive until it's able to save a unique key
}
No.3 :我想是的
No.4 :我不推荐它,创建另一个也是唯一的列,但它是你给用户的东西,但它不是主要的键。 所以这样,您可以为每个客户端/用户提供一个唯一的密钥,这样您以后可以使用它来获取数据,同时仍然使用自动增量作为其他操作的主键。
祝你好运
答案 3 :(得分:0)
我同意@Jonas Staudenmeir你不应该将它作为主键使用。如果你这样做,你不会给DB带来任何好处。相反,将其视为常规应用程序数据;特别是,它听起来像一个slu ..
如果您正在构建生成此密钥的工具,那么您可以像任何其他列一样对其进行验证,以确保它是唯一的。