2016-09-17 29 views
0

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

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

其中: INV - 是接触前缀 {年月日} - 日期YYYMMDD格式 {为这一天唯一编号} - 是那一天的序列号(应该是自动递增,而应该从启动。 0每天。

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

回答

1

您可以使用同一个表执行操作无需创建另一个表或列。

假设您的列名是参考号发票表。

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

$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"; 
} 
0

这里是我的示例代码我用来生成发票编号

$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和值表顺序。 这种格式会生成ex:INV/AG/160917004

希望这回答您的问题。