根据模式生成唯一ID

时间:2016-09-17 09:19:04

标签: php mysql yii2

我有一张表(比如发票),其中有一个主键(自动增量)。 但是我需要另一个参考号,它也应该是唯一的,并且应该基于以下模式。

INV-{Ymd}-{unique number for that day}

其中: INV - 是联系人前缀 {Ymd} - YYYMMDD格式的日期 {当天的唯一编号} - 是当天的序列号。(应该是自动增量,但应该每天从0开始。

示例

  • INV-20160909-0001
  • INV-20160909-0002
  • INV-20160910-0001

2 个答案:

答案 0 :(得分:1)

您可以使用相同的表格执行此操作无需创建其他表格或列。

假设发票表中的列名称为 reference_number

首先,从您的表中获取最新记录。(您可以通过主键插入日期获取

$data=Invoice::find()->select('reference_number')->orderBy(['your_primary_key' => SORT_DESC])->one();

if($data) // record found
{
  $temp= explode('-',$$data['reference_number']); // devide data in array

  // compare with today's date,
  if((int)$temp[1]==(int)date('Ymd')) 
  {
    // if today's date match than increase number and create reference_number
    $reference_number="INV".date('Ymd').((int)$temp[2]+1);
  }
  else // reference_number is from old date so you can create from today's date
  {
  $reference_number="INV".date('Ymd')."0";
  }
}
else // record not found,(no record in your table)
{
  // you can directly create reference_number from today's date

  $reference_number="INV".date('Ymd')."0";
}

答案 1 :(得分:0)

这是我用来生成发票ID的示例代码

$seq = Sequence::FindOne(['seq_id' => 'INV/AG', 'seq_name' => (int)date('ymd')]);
    if(is_null($seq))
    {
        $_seq = new Sequence();
        $_seq->seq_id = 'INV/AG';
        $_seq->seq_name = (int)date('ymd');
        $_seq->value = 0;
        $_seq->save();
        $model->trx_id = $_seq->seq_id . '/' . $_seq->seq_name . str_pad($_seq->value+1, 3, "0", STR_PAD_LEFT);
    }
    else {
        $seq->value += 1;
        $model->trx_id = $seq->seq_id . '/' . $seq->seq_name . str_pad($seq->value, 3, "0", STR_PAD_LEFT);
        $seq->update();
    }

首先,您需要创建包含seq_id,seq_name和value的表序列。 这种格式会生成ex:INV / AG / 160917004

希望这能回答你的问题。