序列id增加日期 - laravel

时间:2017-02-08 08:26:43

标签: php laravel

我试图创建一个增量号码许可证,其中包含当年的当前日期+增量号码,但我真的不知道如何做到这一点我知道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 !

...

怎么回事呢?提前谢谢:)

4 个答案:

答案 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名称,以避免每次都引用它。)

然后,您必须通过代码管理此问题,包括:

  • 确保您在需要时每年都有行(这可以像为下个世纪的所有年份填充数据一样简单。)

  • 确保您不会为不同的项目分配相同的值。

要考虑的内容的粗略概述:

  • 您可以(而且应该)使您的许可证编号成为唯一的索引以避免欺骗。
  • 您可以使用交易来避免不必要的差距。交易应包括所涉及的所有操作:

    1. 获取下一个序列号
    2. 将其保存为新许可
    3. 增加下一个数字
  • 您需要确保在多任务环境中进行原子操作。这是最难的部分。我最近一直在玩MySQL named locks,他们似乎工作正常。