【发布时间】:2020-08-30 18:04:11
【问题描述】:
我正在使用 PHP laravel 7 我有一个优惠券表,其中有一个名为代码的字段,此代码是 8 个字符(数字和字符) 此代码在优惠券记录中应该是唯一的, 在管理面板中,我有一个管理员用户按钮,他可以单击该按钮并生成任意数量的优惠券。 我将与您分享我想到的最佳解决方案,并询问您是否有更好、性能更高的解决方案。
我将使用以下函数在我的 php 代码中生成唯一的字符串:
substr(uniqid(), 0, 8)
然后我将执行一个查询来检查我的表中是否有任何优惠券的代码等于我新生成的代码之一
$model->newQuery()->whereIn('code', $generated_codes)->get();
如果结果列表为空,那很好,我将在数据库中插入所有代码。如果列表不为空,我将从生成的代码中删除重复的代码,并再次根据重复代码的数量再次生成新代码并再次重复该过程,只要没有一个,我将重复该过程生成的代码存在于数据库中 然后我将它们插入数据库。
我的问题与这个问题不同: PHP: How to generate a random, unique, alphanumeric string?
因为我要生成许多唯一代码,而不仅仅是代码,然后我要将这些代码插入数据库中,我需要有最少数量的查询。
【问题讨论】:
-
使用 time() + uniqid id 所以永远不会有重复
-
我只有 8 个字符用于此目的,优惠券代码必须是 8 个字符。
-
你可以在一个查询中从 db 中获取所有代码,然后检查代码(由管理员生成)in_array of codes from db
-
您可以将代码设为您的 id,然后执行
select count(*) from table,然后执行insert ignore ...,然后再次执行select count(*) from table,如果您插入的内容少于您需要的内容,请再次运行。这将比首先为可能数百万条记录执行whereIn快得多,但是我建议使用Str::random(8)来获取随机代码,因为它们比 uniqid 的子字符串更随机 -
@Odin Thunder,请考虑我可能有数千张优惠券,所以我认为这不是一个好的解决方案,我的 php 进程将面临内存泄漏。