2016-09-17 30 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

希望這回答您的問題。