我试图创建一个增量号码许可证,其中包含当年的当前日期+增量号码,但我真的不知道如何做到这一点我知道MYSQl不支持序列,但我想知道是否有办法解决问题
这是我的控制器
public function create(){
$licence = new Licence ;
$licence ->num_licence = Carbon::now()->year -- i would like here to put the current year like 2017 with a random unique number to get the format like 20170001 for exemple !
...
怎么回事呢?提前谢谢:)
答案 0 :(得分:2)
您可以使用当前年份的uniqid
函数作为前缀。
public function create(){
$licence = new Licence ;
$num_liscence_exist=true;
while($num_liscence_exist){
$num_liscence=uniqid(Carbon::now()->year);
if (!Liscence_Table::where('num_liscence', '=',"'".$num_liscence."'")->exists()) {
$liscence->num_liscence=$num_liscence;
$num_liscence_exist=false;
}
}
}
答案 1 :(得分:1)
使用uniqid()
生成随机ID并与日期连接:
public function create(){
$liscence=new Liscence();
$year = Carbon::now()->year;
$liscence->num_liscence= $year. uniqid();
$liscence->save();
}
答案 2 :(得分:1)
使用uniqid()获取唯一编号,或者您也可以使用时间戳:
queue.EncodeMessage = true;
看起来像:2017ABC011486543961
答案 3 :(得分:0)
序列需要存储在某处,所以我怀疑是否有一个合理的纯PHP解决方案。但由于你已经在使用MySQL,所以没有理由不使用它。我为此创建了一个数据库表,如:
CREATE TABLE licence_sequence (
sequence_year YEAR NOT NULL,
next_value INT UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (sequence_year, next_value)
)
ENGINE=InnoDB;
(选择了丑陋的sequence_year
名称,以避免每次都引用它。)
然后,您必须通过代码管理此问题,包括:
确保您在需要时每年都有行(这可以像为下个世纪的所有年份填充数据一样简单。)
确保您不会为不同的项目分配相同的值。
要考虑的内容的粗略概述:
您可以使用交易来避免不必要的差距。交易应包括所涉及的所有操作:
您需要确保在多任务环境中进行原子操作。这是最难的部分。我最近一直在玩MySQL named locks,他们似乎工作正常。